我在博客上发表一些我的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数据类型

Android学习心得(5) --- dex数据类型LEB128_第1张图片

上图显示了dex中LEB128数据类型

LEB表示

每个LEB128由1~5个字节组成,所有字节组合在一起表示一个32位的数据。每个字节有效位为7位,如果第一个字节最高位为1,表示使用两个字节,以此类推,知道最后的字节最高位为0。
这里引用维基百科中对LEB128数据类型的例子来讲解如何把一个无符号数整型数压缩成3bytes的LEB128类型。
//将624485转换成LEB128类型 10011000011101100101        624485使用2进制表示 0100110000111011001012进制的表示的bit扩展为能被7整除(不足的加00100110  0001110  1100101   再以7位为一组进行分组 00100110 10001110 11100101  把第一组扩展08位,而其余的都扩展180xE5     0x8E     0x26      结果表示位16进制 0x26     0x8E     0xE5      最终在内存中的表示
由于维基百科中对有符号整数类型的例子只有文字描述,所有我继续用个例子来讲解。
//将-624485转换成LEB128类型111101100111100010011011    -6244852进制表示,计算机中使用补码表示负数1011001111000100110112进制的表示3位扩展为能被7整除1011001  1110001  0011011   再以7位为一组进行分组01011001 11110001 10011011  把第一组扩展08位,而其余的都根据扩展180x59     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);

更多相关文章

  1. Android 限制edittext 整数和小数位数 过滤器
  2. 大佬就是强!意外收获字节跳动内部资料——《Android Binder机制实
  3. android上文本框输入限制最大字节数
  4. android中流的理解。(字节流读写与字符流的读写)
  5. android 布局文件中控件ID、name标签属性的命名包含“@”、“.”
  6. android中限制EditText最大输入字节数
  7. Java 字节码编译为Dex,d8比dx更好用!
  8. android中使用特殊符号

随机推荐

  1. android Pull解析复杂XML 转
  2. [android]组件之一Activity简介
  3. Android 线程学习
  4. 【Android】几种常见广播监听器(Wifi,亮
  5. 为Android加入busybox工具
  6. android view getWidth 和 getHeight 的
  7. Android单元测试之Testing和Instrumentat
  8. android apk编译
  9. 浅析Android线程模型一
  10. Android的专用驱动