在监视分析SNMP数据包时,发现OID数据的编码有些奇怪,查阅相关资料未果,请高手指教!如OID=1.3.6.1.4.1.231.……时,数据包中为2B 06 01 04 01 81 67 ……,已经知道2B=(OID的第一个值×40)+OID第二个值(即1×40+3 = 2B,查资料得来),但是231是怎么变成81 67的呢?经过反复观察,还得出一个规律如下:
OID值    数据包值  差值
710   = 85 46     82 80
202   = 81 4A     80 80
236   = 81 6C     80 80
231   = 81 67     80 80
295   = 82 27     81 00
318   = 82 3E     81 00
请教到底这么编码的依据是什么?有什么固定的算法吗?谢谢!

解决方案 »

  1.   

    2b: OID中1.3 的编码 1*40+3其中每个字节只用7位表示,最大表示为0x7F,字节中最高位则用于表示是否包含后面的字节,
    比如231,其表示位1000 0001,0110 0111,出去最高位为000 0001(0x01),110 0111(0x67)
    第一个字节最高位为1,则表示包含后面一个字节,第二个字节最高位位0,则表示以它为结束
    即0x01×0x80 + 0x67 = 231
    29895这个数字对应的编码为81 e9 47出去最高为即0000001(0x01),1101001(0x69),1000111(0x47),((0x01×0x80+0x69)*0x80)+0x47=29895
      

  2.   

    不过,请问scu_suke(),29895这个数字编码为81 e9 47,除去最高为即0000001(0x01),1101001(0x69),1000111(0x47),如果说字节中最高位则用于表示是否包含后面的字节,第二个字节为什么不用去最高位?
      

  3.   

    0xe9(11101001),去了最高为才是0x69(1101001)