Android学习心得(5) --- dex数据类型LEB128
来源:互联网 发布:淘宝上怎么能卖酒 编辑:程序博客网 时间:2024/05/16 10:59
我在博客上发表一些我的Android学习心得,希望对大家能有帮助。在前一章我们学习了如何进行Android源代码下载,这一章学习基本的Dalvik指令集编写
Android学习心得(1) --- MAC下Android环境的搭建
Android学习心得(2) --- MAC下Android反编译
Android学习心得(3) --- MAC下Android源代码下载
Android学习心得(4) --- MAC下smali文件编写与运行
LEB128就是使用了一种 Variable-length quantity (VLQ:使用任意位数的二进制来表示一个任意大的数字的一种编码方式)
类型的压缩算法。当然,可以是表示有符号的,也可表示无符号的。
1、首先我们先看下dex文件中用到的LEB128数据类型
上图显示了dex中LEB128数据类型
每个LEB128由1~5个字节组成,所有字节组合在一起表示一个32位的数据。每个字节有效位为7位,如果第一个字节最高位为1,表示使用两个字节,以此类推,知道最后的字节最高位为0。
这里引用维基百科中对LEB128数据类型的例子来讲解如何把一个无符号数整型数压缩成3bytes的LEB128类型。
//将624485转换成LEB128类型 10011000011101100101 624485使用2进制表示 010011000011101100101 将2进制的表示的bit扩展为能被7整除(不足的加0) 0100110 0001110 1100101 再以7位为一组进行分组 00100110 10001110 11100101 把第一组扩展0为8位,而其余的都扩展1为8位 0xE5 0x8E 0x26 结果表示位16进制 0x26 0x8E 0xE5 最终在内存中的表示
由于维基百科中对有符号整数类型的例子只有文字描述,所有我继续用个例子来讲解。
//将-624485转换成LEB128类型111101100111100010011011 -624485的2进制表示,计算机中使用补码表示负数101100111100010011011 把2进制的表示3位扩展为能被7整除1011001 1110001 0011011 再以7位为一组进行分组01011001 11110001 10011011 把第一组扩展0为8位,而其余的都根据扩展1为8位0x59 0xf1 0x9b 结果表示位16进制0x9b 0xf1 0x59 最终在内存中的表示
在维基百科中,给出如何编码和解码的类c伪代码,这里直接贴出来让大家学习下。
C-like pseudo-code//Encode unsigned integer 编码无符号整数do { byte = low order 7 bits of value; value >>= 7; if (value != 0) /* more bytes to come */ set high order bit of byte; emit byte;} while (value != 0);//Encode signed integer 编码有符号整数more = 1;negative = (value < 0);size = no. of bits in signed integer;while(more) { byte = low order 7 bits of value; value >>= 7; /* 如果使用算数移位,则下面这一步不需要,如果使用逻辑移位,则需要下面一步 */ if (negative) value |= - (1 <<(size - 7)); /* sign extend */ /* sign bit of byte is second high order bit (0x40) */ if ((value == 0 && sign bit of byte is clear) || (value == -1 && sign bit of byte is set)) more = 0; else set high order bit of byte; emit byte;}//Decode unsigned integer 解码无符号整数result = 0;shift = 0;while(true) { byte = next byte in input; result |= (low order 7 bits of byte << shift); if (high order bit of byte == 0) break; shift += 7;}//Decode signed integer 解码有符号整数result = 0;shift = 0;size = number of bits in signed integer;while(true) { byte = next byte in input; result |= (low order 7 bits of byte << shift); shift += 7; if (high order bit of byte == 0) break;}/* sign bit of byte is second high order bit (0x40) */if ((shift <size) && (sign bit of byte is set)) /* sign extend */ result |= - (1 << shift);
0 0
- Android学习心得(5) --- dex数据类型LEB128
- Android学习心得(15) --- Dex文件结构解析(1)
- Android学习心得(16) --- Dex文件结构实例解析(2)
- LEB128格式简介(CN)
- LEB128格式简介(CN)
- Android学习心得(6) --- smali语法学习
- Android学习心得(12) --- APK签名keystore
- Android学习心得(17) --- 二进制AndroidManifest解析
- Struts1.2.4学习心得!(-)
- Android学习心得(10) --- MAC下Android反编译(2)
- Android学习心得(11) --- MAC下Android反编译(3)
- Android学习心得(13) --- Android代码混淆(1)
- Android学习心得(14) --- Android代码混淆(2)
- Android学习心得(1) --- MAC下Android环境的搭建
- Android学习心得(2) --- MAC下Android反编译
- Android学习心得(3) --- MAC下Android源代码下载
- QT学习心得(1)--初学者
- Android学习心得(4) --- MAC下smali文件编写与运行
- ubuntu下FFMPEG编译安装
- 解决Ubuntu系统中文乱码显示问题
- 动态代理剖析
- 在flash编程过程中的一些小技巧
- 携程瘫痪事件反思:历史会记住的
- Android学习心得(5) --- dex数据类型LEB128
- Python核心编程第九章笔记及习题记录[待更新]
- iGrimace 作任务必看
- 不做伸手党,分享快乐,Laravel5 入门小项目详细教程
- 直接拿来用!最火的iOS开源项目(一)、(二)、(三)
- 大一第二学期第11周【项目3—点类派生直线类】
- 分配工作时描绘愿景
- 小糖出品:面向对象三大特性之封装
- 小韩认识:继承