为什么 Pysnmp 将字节保存为字符串 Python 3
Why does Pysnmp save bytes as strings in Python 3
我正在尝试在 Python 3.4.2 中使用 val.prettyPrint()
使用 Pysnmp 4.3.1 来读取 OID 的值。 val.prettyPrint()
returns 任何类型变量的字符串。所以我收到这个值 "b'zeus.snmplabs.com'"
作为字符串类型而不是字节类型。因此,当我将此数据发送到服务器时,它会将 b
前缀视为字符串的一部分。这是错误还是故意的功能?
这是一个错误(实际上,在 pyasn1 中),但是 development pysnmp code 有一个解决方法。
请记住,在 SNMP(和 ASN.1)中,OCTET STRING 类型应该携带字节,而不是文本。因此,如果可能,.prettyPrint() 会尝试将值表示为可打印的 7 位 ASCII 字符串。否则它会切换到十六进制表示 (0xdeadbeef)。
应携带文本的 SNMP 对象通常在 MIB 中明确键入为 TEXTUAL-CONVENTION 对象。根据 MIB 信息,SNMP 管理器会将 "cast" protocol-level OCTET STRING 值转换为指定编码(ASCII 或 UTF-8)的可打印文件,并忽略所有 non-printable 字符。
我正在尝试在 Python 3.4.2 中使用 val.prettyPrint()
使用 Pysnmp 4.3.1 来读取 OID 的值。 val.prettyPrint()
returns 任何类型变量的字符串。所以我收到这个值 "b'zeus.snmplabs.com'"
作为字符串类型而不是字节类型。因此,当我将此数据发送到服务器时,它会将 b
前缀视为字符串的一部分。这是错误还是故意的功能?
这是一个错误(实际上,在 pyasn1 中),但是 development pysnmp code 有一个解决方法。
请记住,在 SNMP(和 ASN.1)中,OCTET STRING 类型应该携带字节,而不是文本。因此,如果可能,.prettyPrint() 会尝试将值表示为可打印的 7 位 ASCII 字符串。否则它会切换到十六进制表示 (0xdeadbeef)。
应携带文本的 SNMP 对象通常在 MIB 中明确键入为 TEXTUAL-CONVENTION 对象。根据 MIB 信息,SNMP 管理器会将 "cast" protocol-level OCTET STRING 值转换为指定编码(ASCII 或 UTF-8)的可打印文件,并忽略所有 non-printable 字符。