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()
会将其转换为以冒号分隔的十六进制形式。
我有一个 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()
会将其转换为以冒号分隔的十六进制形式。