如何转换我从SNMP收到的十六进制值?

时间:2016-02-16 17:32:28

标签: python hex snmp pysnmp

我使用PYSNMP作为处理SNMP的工具 snmp中的许多OID都以十六进制值表示 以下是序列号OID的示例:

1.3.6.1.4.1.1602.1.2.1.4.0 = Hex-String: 0115434e443846374d485646

我可以将此十六进制值转换为更易于理解的类型,方法是将其转换为integerstring
问题是我无法知道十六进制值的预期类型,无论是字符串还是整数 例如,十六进制字符串0115434e443846374d485646在转换为string时等于CND8F7MHVF,但转换为integer时等于335190294349398493576582726
在此示例中,如果我想要检索正确的结果,则应将十六进制值转换为字符串,但在其他情况下,我可能需要将十六进制值转换为整数以获得正确的结果,因为序列号也可以是整数。
我应该如何转换Hex-String以接收Hex-String的预期值?

2 个答案:

答案 0 :(得分:1)

在SNMP中,HEX值通常与OCTET STRING类型相关联,而不是与INTEGER相关联。

当SNMP将INTEGER放入数据包时,它会被明确标记为。在接收端,你总是知道它是INTEGER,所以你可以把它转换成你想要的任何基础,并且不会改变它的语义或价值。

OCTET STRING类型适应一系列字节。这可能代表可打印的字符串或MAC地址,或者可能代表特定于应用程序的某些内容。无论内容如何,​​线中的值都被标记为相同(例如,在分组级别)。因此,弄清楚如何解释特定OCTET STRING值的唯一方法是查看与该值相关联的OID(通过MIB中的OBJECT-TYPE定义)。

为了帮助解释基本SNMP类型(特别是OCTET STRING),SNMP有一个名为TEXTUAL-CONVENTION的虚拟类型。它定义了OCTET STRING中八位字节的布局,以便自动生成一些人性化的东西。

对于pysnmp,您只需要在定义了相关托管对象的位置加载MIB​​,然后让pysnmp通过将.prettyPrint()应用于它返回的对象来完成剩下的工作。

答案 1 :(得分:0)

显然,当您将MAC ADDRESS(根据定义为HEX-BASED)转换为STRING时,您做错了。

通常,SNMP中的确切类型是在MIB-s中定义的,这种类型基于SMIv1 / SMIv2类型的有限子集,不应该有任何误解。