使用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)格式介绍
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
2020-01-06 Go简介