可可西

使用LEB128格式对整数进行编码

大小端

比如说4个字节长度的一个十六进制的无符号整数:0x12 34 56 78,使用大端和小端两种表示方法的内存布局如下:

 

LEB128编码说明

LEB128(Little-Endian Base 128)使用小端表示法,因为计算机处理小端表示法比较方便。

其每个字节只有7位为有效位,如果第一个字节的最高位为1,表示LEB128需要使用第二个字节,如果第二个字节的最高位为1,表示会使用到第三个字节,以此类推,直到最后的字节最高位为0

注:LEB128最多使用到5个字节,如果读取5个字节后下一个字节最高位仍为1,则表示编码无效。

 

LEB128具体分为:

① ULEB128(unsigned LEB128,无符号整数编码)

② SLEB128(signed LEB128,有符号整数编码)

③ ULEB128p1(unsigned LEB128 plus 1,特殊无符号整数编码)

 

ULEB128(unsigned LEB128,无符号整数编码)

无符号整数12726(二进制为:0011 0001 1011 0110)的ULEB128编码为0xb663,其解码过程如下所示:

SLEB128(signed LEB128,有符号整数编码)

有符号整数-3658(二进制为:0011 0001 1011 0110,【补码】去掉符号位取反+1得:0 1110 0100 1001 + 1 = 0 1110 0100 1010 = 3658)的SLEB128编码为0xb663,其解码过程如下所示:

 

ULEB128p1(unsigned LEB128 plus 1,特殊无符号整数编码)

ULEB128p1编码格式的值为ULEB128的值+1。所以计算ULEB128p1格式的值时,通常将这个值转换为ULEB128格式,然后这个值的基础上减去一,得到的值就是ULEB128p1格式的值。

引入ULEB128p1编码格式的目的是为了表示“-1”这个值,“-1”这个值也是最小的,例如LEB128编码“00”,使用ULEB128格式进行解析,获得的值是0,所以ULEB128p1格式的值为0减去1,等于-1。这也是ULEB128p1表示的最小的值。

 

参考

LEB128(Little-Endian Base 128)格式介绍

 

posted on 2025-01-06 23:31  可可西  阅读(5)  评论(0编辑  收藏  举报

导航