如何基于LEB128算法从可变字节中解码数据包长度
基于LEB128的数据包长度解码与拆分完整规则
这是无符号LEB128的变体编码,解码得到的数值是包含长度字段自身的整个数据包总长度,结合你的示例,完整规则如下:
一、LEB128长度字段解码步骤
- 初始化变量:
total_length = 0,shift = 0,length_byte_count = 0 - 循环读取数据流中的字节,直到遇到最高位为0的字节:
- 读取单个字节
b,length_byte_count += 1 - 提取
b的低7位有效数据(b & 0x7F),左移shift位后累加到total_length:total_length += (b & 0x7F) << shift - 如果
b的最高位(b & 0x80)为1,说明后续还有长度字节,将shift +=7继续循环;如果为0,解码结束
- 读取单个字节
二、有效数据长度计算
根据你的示例,数据包存在两种结构,对应不同的有效长度计算方式:
结构1:[LEB128长度字段] + [2字节固定头] + [有效数据]
对应示例1、2,有效数据长度 = total_length - length_byte_count - 2
- 当长度字段为1字节时,简化为
total_length - 3(即你总结的公式)
结构2:[LEB128长度字段] + [有效数据]
对应示例3、4、5、6,有效数据长度 = total_length - length_byte_count
- 当长度字段为2字节时,简化为
total_length - 2(即你总结的公式)
三、示例验证
示例1:
- 长度字段:
0x1A(单字节) - 解码:
total_length = 0x1A = 26,length_byte_count =1 - 有效长度:
26 -1 -2 =23,与你的结果一致
示例3:
- 长度字段:
0xAC 0x06 - 解码:
- 读取
0xAC:低7位0x2C,total_length=44,最高位1,shift=7 - 读取
0x06:低7位0x06,total_length=44 + (0x06<<7)=812,最高位0,结束
- 读取
- 有效长度:
812 -2=810,与你的结果一致
示例5:
- 假设你写的
eb08是字节顺序颠倒(实际长度字段为0x08 0xEB),解码后total_length=2399+2=2401 - 有效长度:
2401-2=2399,符合你的描述
四、公式中-3、-2的由来
-3= 长度字段字节数(1) + 固定头字节数(2),是总长度减去长度字段和固定头的结果-2= 长度字段字节数(2),是总长度减去长度字段的结果
五、拼接数据包拆分流程
- 从数据流起始位置开始,按LEB128规则解码得到
total_length和length_byte_count - 截取当前位置开始的
total_length字节,作为一个完整数据包 - 将数据流指针移动到该数据包末尾,重复步骤1-2直至数据流处理完成
内容的提问来源于stack exchange,提问作者assoonaspossible
相关产品推荐
相关产品推荐

