如何编码大于32768的SNMP OID数字?我的BER编码是否正确?
关于大OID数字的BER编码正确性确认
你的编码方式完全正确,完全符合BER(基本编码规则)对OID中大于127的数字的编码规范。
关键编码规则
BER对OID数字采用可变长度字节编码,核心规则:
- 每个字节的最高位为延续标记:值为1时,表示后续还有字节属于当前数字;值为0时,表示这是当前数字的最后一个字节。
- 每个字节的低7位是有效数据位,将这些数据位按顺序拼接后即可还原原始数字。
你的编码验证拆解
你编码的第7个OID数字33500对应的字节是0x82、0x85、0x5c,计算逻辑完全正确:
- 提取各字节的低7位有效数据:
0x82去掉最高位后为十进制20x85去掉最高位后为十进制50x5c去掉最高位后为十进制92(即十六进制0x5c)
- 按权重拼接计算:
2 * 128² + 5 * 128 + 92 = 32768 + 640 + 92 = 33500,与原始数字完全一致。
多字节编码的设计目的
BER采用这种可变长度编码是为了节省空间:
- 对于小于128的数字,仅需1个字节(最高位设为0)即可表示;
- 对于大于等于128的数字,需要拆分到多个字节,中间字节最高位设1,最后一个字节最高位设0。33500远大于128,因此需要3个字节编码,你的实现完全符合该规则。
内容的提问来源于stack exchange,提问作者NastyBen
相关产品推荐
相关产品推荐

