在开发我自己的SNMP轮询器时,我遇到了能够轮询具有32位接口索引的设备的问题。我找不到任何解释如何将十六进制(5个字节)转换为32位整数或从整数转换为十六进制的内容,因为它不使用简单的十六进制转换。例如,接口索引是436219904.在使用snmpget执行pcap时,我看到这个的十六进制是81 d0 80 e0 00,这是没有意义的。我不能为我的生活弄清楚如何转换为整数值。我试图找到一个解决这个问题的RFC并且没有运气。 16位接口值按原样转换。 0001 = 1等等。只有32位的人似乎在给我这个问题。任何帮助表示赞赏。
答案 0 :(得分:0)
SNMP使用ASN.1语法对数据进行编码。因此,您需要了解BER规则,
http://en.wikipedia.org/wiki/X.690
对于你的情况,我可以说你看了错误的数据,好像436219904将在SNMP中编码为Integer32
,字节应为1A 00 30 00
。
我猜你错过了分析中的一些细节,所以你可能想再次这样做并添加更多描述(截图等)来丰富你的问题。
答案 1 :(得分:0)
我怀疑你的问题中缺少的关键信息是你的轮询中使用的ifIndex值是轮询表的索引(没有提到哪个,但我们可以假设ifTable),这意味着它将是编码为被轮询的OID的子标识符(为[this ifIndex]提供[某些属性])与请求的值(给[另一个表格的某些其他行的[ifIndex]])。
Per X.209(SNMP使用的ASN.1基本编码规则的版本)OID中的子标识符(前两个除外)以一个或多个八位位组(8位)编码,具有最高位用作连续位(即“下一个八位字节也是此子标识符的一部分”),然后为实际值保留7位。
换句话说,在您的值“81 d0 80 e0 00”中,最高位在前4个八位字节的每一个中设置并在最后一个八位字节中清除:这就是您知道子标识符中有5个八位字节的方式。将每个八位字节的剩余7位连接起来以得到整数值。
当然,相反的是,要将整数值编码为OID的子标识符,您必须一次构建7位。