Python 将字符串转换为 UTF

Python converting string to UTF

我有一个 OctetString 值 0xe4c722d60a61(实际上是一个 MAC 地址)我的代码在转换为字符串时削弱了 UTF,例如'äÇ"Ö\na'.

该代码处理大量数据,但只有一小部分属于这种类型。

我怎样才能阻止这种情况发生?

这是输出:

(Pdb) snmpVal
[ObjectType(ObjectIdentity(<ObjectName value object at 0x7f77d152eef0 tagSet <TagSet object at 0x7f77d620ba20 tags 0:0:6> payload [1.3.6.1.2.1.2.2.1.6.3]>), <PhysAddress value object at 0x7f77d152e7b8 encoding iso-8859-1 subtypeSpec <ConstraintsIntersection object at 0x7f77d61d7518 consts <ValueSizeConstraint object at 0x7f77d61d74e0 consts 0, 65535>> tagSet <TagSet object at 0x7f77d620b550 tags 0:0:4> payload [e4:c7:22:d6:0a:60]>)]
(Pdb) snmpVal[0][1]
<PhysAddress value object at 0x7f77d152e7b8 encoding iso-8859-1 subtypeSpec <ConstraintsIntersection object at 0x7f77d61d7518 consts <ValueSizeConstraint object at 0x7f77d61d74e0 consts 0, 65535>> tagSet <TagSet object at 0x7f77d620b550 tags 0:0:4> payload [e4:c7:22:d6:0a:60]>
(Pdb) str(snmpVal[0][1])
'äÇ"Ö\n`'
(Pdb) hex(snmpVal[0][1])
*** TypeError: 'PhysAddress' object cannot be interpreted as an integer

这是代码:

    cmdGen = cmdgen.CommandGenerator()
    errorIndication, errorStatus, errorIndex, snmpVal = cmdGen.getCmd(
        cmdgen.UsmUserData(user, 
                        authKey=authKey, 
                        privKey=privKey, 
                        authProtocol=authProto, 
                        privProtocol=privProto, 
                        securityEngineId=None
                ),
        cmdgen.UdpTransportTarget((sHost, 161)),
        '1.3.6.1.2.1.2.2.1.6.3' )

您不想通过您的描述将其转换为 UTF 字符串。 Python 有一个名为 hex 的内置函数,您可以使用它。它将任何 int 值转换为十六进制字符串。从那里您可以通过一些列表理解和字符串连接自己添加冒号。试试这个:

a = hex(0xe4c722d60a61)
print(':'.join(a+b for a,b in zip(a[::2],a[1::2]))[3:])

如果您需要处理原始 OCTET STRING 值,只需对该对象调用 .asOctets()。你最终会得到 bytes (Py3) 或 str (Py2)。如果您需要将 OCTET STRING 转换为 unicode(我怀疑这是个好主意),您可以从这里 运行 unicode 解码器。

如果您想要 MAC 地址的人性化表示,只需对该对象调用 .prettyPrint()。如果它已经针对 MIB 进行了解析,那么 pysnmp 知道它是一种 PhysAddress 类型的 OctetString,因此 .prettyPrint() 会将其转换为以冒号分隔的十六进制形式。