我有一个OctetString值0xe4c722d60a61
(实际上是一个MAC地址),我的代码在转换为字符串(例如, 'äÇ"Ö\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' )
答案 0 :(得分:1)
如果您需要处理原始OCTET STRING值,只需在对象上调用.asOctets()
。您将以bytes
(Py3)或str
(Py2)结尾。如果您需要将OCTET STRING转换为unicode,则可以从此处运行unicode解码器(我怀疑这是个好主意)。
如果您希望用友好的方式表示MAC地址,只需在对象上调用.prettyPrint()
。如果已经针对MIB进行了解析,则pysnmp知道它是PhysAddress
的一种OctetString
,因此.prettyPrint()
会将其转换为冒号分隔的十六进制形式。
答案 1 :(得分:0)
您不想通过描述的声音将其转换为UTF字符串。 Python有一个称为hex
的内置函数供您使用。它将任何int
值转换为十六进制字符串。从那里,您可以自己添加一些列表理解和字符串连接的冒号。试试这个:
a = hex(0xe4c722d60a61)
print(':'.join(a+b for a,b in zip(a[::2],a[1::2]))[3:])