leb128讲解

leb128讲解

通常我们用4个字节,也就是32bits来表示整数。但是在某些场景就会显得有些浪费空间。 在Android的虚拟机中使用了一种叫LEB128(Unsigned Little Endian Base 128)的编码方式来节省空间。

他使用1-5个字节来处理数据,那么就涉及到一种转换,从正常的数字到leb128,和leb128到正常的数据。

那么他是如何规定的呢?

正常的数据是8bits表示一个字节也就是0000 0000而leb128规定只是用后7位,最高位有特殊含义。

  1. 如果最高位为1: 表示当前字节还没有结束,继续忘后看1个字节。
  2. 最高位为0: 表示上个字节结束,当前字节只占用8位,和一般的是一样的。根据这条可知如果数据小于0x7F(10进制127, 二进制:0111 1111)即后续没有字节了。
  3. 然后去掉每个字节的最高位
  4. 根据小端模式从新组合

举例:

  1. (1-2)最高位1的情况,有个数字用16进制表示:...88 80 04...。 对应的二进制:1000 1000 1000 0000 0000 0100 根据规则,第一个字节的最高位是1,那么还要继续看下一个字节(一个字节8位,也就是8个0或1)的最高位1,最高位是1,继续看下一个字节,最高位是0,所以停止往下看,这个数实际占用3个字节。

  2. (3)然后去掉最高位:000 1000 000 0000 000 0100

  3. (4)小端模式从新最合:000 0100 000 0000 000 1000

所以88 80 04实际表示的是0x10008

声明:原创文章,版权所有,转载请注明出处,https://litets.com。