You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于LEB128算法从可变字节中解码数据包长度

基于LEB128的数据包长度解码与拆分完整规则

这是无符号LEB128的变体编码,解码得到的数值是包含长度字段自身的整个数据包总长度,结合你的示例,完整规则如下:

一、LEB128长度字段解码步骤

  1. 初始化变量:total_length = 0,shift = 0,length_byte_count = 0
  2. 循环读取数据流中的字节,直到遇到最高位为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
  • 解码:
    1. 读取0xAC:低7位0x2C,total_length=44,最高位1,shift=7
    2. 读取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),是总长度减去长度字段的结果

五、拼接数据包拆分流程

  1. 从数据流起始位置开始,按LEB128规则解码得到total_length和length_byte_count
  2. 截取当前位置开始的total_length字节,作为一个完整数据包
  3. 将数据流指针移动到该数据包末尾,重复步骤1-2直至数据流处理完成

内容的提问来源于stack exchange,提问作者assoonaspossible

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 22:04:50