位置: 编程技术 - 正文

uleb128、sleb128和uleb128p1编码格式介绍

编辑:rootadmin

推荐整理分享uleb128、sleb128和uleb128p1编码格式介绍,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

在程序中,一般使用位比特位来表示一个整型的数&#;。不过,一般能够使用到的整数&#;都不会太大,使用比特位来表示就有点太浪费了。对于普通计算机来说,这没什么问题,毕竟存储空间那么大。但是,对于移动设备来说,存储空间和内存空间都非常宝贵,不能浪费,能省就省。

Android的Dalvik虚拟机中,就使用了uleb(Unsigned Little Endian Base )、ulebp1(Unsigned Little Endian Base Plus 1)和sleb(Signed Little Endian Base )编码来解决整形数&#;占用空间大小浪费的问题(在Dalvik虚拟机中只使用这三种编码来表示位整形数&#;)。

首先,我们来看看uleb编码是怎么回事。要了解原理,最简单的方法,还是阅读代码。Dalvik使用readUnsignedLeb函数来尝试读取一个uleb编码的数&#;(代码位于dalviklibdexLeb.h中):

代码非常简单,先读取第一个字节,并判断其是否大于0x7f,如果大于的话,则代表这个字节的最高位是1,而不是0。如果是1的话,则代表还要读下一个字节;如果是0的话,则代表uleb编码的数&#;到此为止。而代表原来整型&#;的位数据就嵌入在每个字节当中的7比特位中(应为最高位被用来表示编码是否结束了)。所以,如果要表示的整形&#;非常大的话,就需要5个字节表示了(反而比原来多一个字节)。而其实uleb可以表示数&#;的范围其实是要比位整形&#;要大的,有三位被浪费掉了。不过,一般程序中使用的整型&#;都不会太大,经常是小于的,对于这种情况来说,只需要使用一个字节就可以表示了,比普通位整形表示法少用了3个字节,节省的空间还是非常可观的。

uleb编码,正如其名,是小端结尾的。因此第一个字节代表的是整形&#;的最低7比特位的&#;,第二个字节代表整型&#;的次低7比特位的&#;,以此类推,最后一个字节(最高位为0)代表整形&#;的最高7比特位的&#;。所以,代码中每发现要多用一个字节,都要多向左移动7位。

在Android源码提供的文档中,有下面这张图,可以帮助理解:

这张图表示了,只使用两个字节进行编码的情况。可以看到,第一个字节的最高位为1,代表还要用到接着的下一个字节。并且,第一个字节存放的是整型&#;的最低7位。而第二个字节的最高位为0,代表编码到此结束,剩下的7个比特位存放了整型&#;的高7位数据。

uleb128、sleb128和uleb128p1编码格式介绍

综上所述,对于uleb编码来说,其特点如下:

1)一个uleb编码的整形&#;,其占用的字节数是不确定的,长度有可能在1到5个字节之间变化;

2)一个uleb编码的整形&#;,是以字节中最高位是否为0来表示字节流有没有结束的。

好,我们接下来在看看sleb编码的实现。Dalvik使用readSignedLeb函数来读取一个sleb编码的数&#;(代码同样位于dalviklibdexLeb.h中):

可以看出来,其实处理的方法还是非常相&#;的。唯一的不同是,这里存放的是有符号整形数&#;,因此需要相应的进行符号位扩展,代码中是通过先左移到最左边,再算术右移同样的位数来实现的。

因此,sleb和uleb最大的区别就是,其编码的整形数&#;是有符号的,其它完全一样。

最后,我们再来看一个变种,也就是ulebp1。这种编码方式是Dalvik独有的,如果所要表示的整数范围只包含一个负数,也就是-1的话,如果直接用sleb编码,那就太浪费了,因此Android创造出了这种所谓的ulebp1的编码方式。实现如下(代码位于libcoredexsrcmainjavacomandroiddexDex.java):

其实现原理就更简单了,就是将其当做uleb编码的&#;进行解码,然后再减一就可以了。因为uleb能表示范围为0~4,,,的整数,所以ulebp1就可以表示范围为-1~4,,,的整数。解码时要减一,那么反过来,编码时就需要加一。

版权声明:本文为博主原创文章,未经博主允许不得转载。

在Windows下搭建Android开发环境 随着移动互联网的迅速发展,前端的概念已发生很大的变化,已不仅仅局限在网页端。而Android系统作为智能机市场的老大,作为前端开发工程师,非常

Android基础之AsyncTask的doInBackground方法参数详解 AsyncTask的使用方法和理解1、对于耗时的操作,我们的一般方法是开启子线程。如果需要更新UI,则需要使用handler2、如果耗时的操作太多,那么我们需要

android对handler及asynctask的一个例子 Android子线程更新UI主线程方法之HandlerAndroid之多线程工作-AsyncTask与handler详解Android中AsyncTask的使用Android线程和Handler基础入门Android中Handler的机制?xmlversion

标签: uleb128、sleb128和uleb128p1编码格式介绍

本文链接地址:https://www.jiuchutong.com/biancheng/379565.html 转载请保留说明!

上一篇:Android百分比布局源代码解析(android百分比布局)

下一篇:在Windows下搭建Android开发环境(在windows下搭建snort和base)

  • 境外代扣代缴增值税
  • 企业购车发票怎么查询
  • 商业折扣和现金折扣的入账金额
  • 以前年度无形资产本年摊销额
  • 不动产官网查询
  • 应付账款超过三年未付
  • 未开票收入下月开票怎么报税
  • 加油票怎么记账凭证
  • 开发票要多交费正常吗?
  • 社保次月什么时候到账
  • 结算备付金是流水账单吗
  • 多交的季度所得税怎么算
  • 国有控股企业股权转让
  • 理财产品分红怎么入账
  • 试车要给钱吗
  • 计提固定资产的方法有几种?
  • 员工离职后收取客户钱款
  • 记账凭证一定要签字吗
  • 免税企业土地税怎么交
  • 一般纳税人能开3%的专票吗
  • 已抵扣发票丢失如何处理
  • 理财赎回本金没赎回利息咋办
  • 上个月印花税少计提了怎么办
  • 固定资产平均年限法公式
  • 已发货未开票的货物需要结转成本吗
  • 开办费计入长期待摊费用汇算清缴时怎么填写
  • 半成品加工费计入什么科目
  • 员工离职补偿金计算方法
  • 收到增值税红字发票怎么入账
  • 留抵增值税的会计处理
  • 建筑劳务公司计提人工劳务费需要工资表吗?
  • vlookup函数怎么用跨表格匹配
  • PHP:mb_encode_mimeheader()的用法_mbstring函数
  • 电脑任务栏图标怎么全部显示出来
  • PHP:Memcached::deleteMultiByKey()的用法_Memcached类
  • 若依官网
  • 150m迷你型无线路由器怎么用
  • 使用灭火器人要站在上风口还是下风口
  • 结转应付职工薪酬会计科目
  • 企业出售生产设备能开票吗怎么开
  • 在暴风雪中求生
  • PHP面向对象程序设计调研
  • 发票查真伪是什么意思
  • AIGC之GPT-4:GPT-4的简介(核心原理/意义/亮点/技术点/缺点/使用建议)、使用方法、案例应用(计算能力/代码能力/看图能力等)之详细攻略
  • New Bing怼人、说谎、PUA,ChatGPT已经开始胡言乱语了
  • css page-break-after
  • 销售不动产预征率是多少
  • 旅行社代订机票的发票可以抵税吗
  • c标准库pdf下载
  • php 更新
  • 质量扣款可以放到费用吗
  • 会计学中的折旧是什么意思
  • macos mysql安装
  • 接受母公司捐赠现金分录
  • 其他综合收益的来源
  • 预付账款和应付账款减少
  • 固定资产计提折旧的账务处理
  • 房地产企业预缴土地增值税
  • 资本公积的核算维度是什么
  • 银行退回服务费怎么写分录
  • 分公司账务处理需要注意哪些
  • 私营企业主的现金流特征
  • ubuntu系统常用命令
  • c盘满了怎么释放空间
  • 如何删除win7
  • linux系统变卡慢了
  • iptables配置详解
  • win10系统中怎么设置搜狗输入
  • 举例说明如何为教学搭建支架
  • javascript 数组
  • java的匿名内部类
  • ubuntu14重置密码
  • vue只适合做单页项目吗
  • android 设备信息
  • android_sqlite开发入门
  • 个体工商户年报补报流程
  • 5种方式教你如何查询
  • 土地流转需要什么材料
  • 税务有哪些方面
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设