如何编码和解码大的OID值?

时间:2013-08-11 21:10:20

标签: snmp

我的OID为1.3.6.1.2.1.2.2.1.8.4096(ifOperStatus)

在我的代码中,我有:

MIB[0]=0x2b
MIB[1]=0x06
MIB[2]=0x01
MIB[3]=0x02
MIB[4]=0x01
MIB[5]=0x02    
MIB[6]=0x02
MIB[7]=0x01
MIB[8]=0x08
MIB[9]=0xA0
MIB[10]=0x00

其中A0 00代表4096。

HEX中的<40> 4096是1000。 以2个字节打破这个将给我10 00。 SNMP数据应以单字节格式发送。 因此,大数字需要特殊规则,因为一个字节(8位)只能表示0-255之间的数字。规则是最高位用作标志,让收件人知道这个数字跨越多个字节。

我已将位移到左侧,并将第1位添加到第8位。

向左移动:20 00
位8变为1:A0 00

参考: [OID编码](http://www.rane.com/note161.html

我是否正确编码了4096?

如何将数据串解码为原始OID?

例子对我理解这个概念是有好处的。

1 个答案:

答案 0 :(得分:4)

是的,您已正确编码OID(就内容而言)。完整的编码(带有OID和长度的标签,省略了)将是06 0b 2b 06 01 02 01 02 02 01 08 a0 00.

关于在OID中编码/解码字符串(可能是INDEX),规则取决于所讨论的值是否针对定义为固定长度或可变长度字符串的对象,以及是否IMPLIED关键字用于定义INDEX。

如果它是一个固定长度的字符串,或者带有IMPLIED关键字的可变长度字符串(必须是最后一个INDEX对象),那么它每个字节的字节只被编码为一个子标识符。否则,使用一个子标识符对可变长度字符串进行编码以指示字符串的长度,然后在单个子标识符中编码的每个字节与固定长度一样。

RFC 2578第7.7节详细说明了在OID中对INDEX对象的值进行编码的规则。