如何解码定义为字符串的十六进制字节?

时间:2019-06-07 17:16:30

标签: python string hex byte decode

我以字符串形式读取文件中的打印字节:

a = "b'\xa0-\xfc\xa3\xf8\xd9'" 

type(a)str

我应该如何解码?

解码后的值应为a02dfca3f8d9

文件的一部分已上传到此处:https://www.dropbox.com/s/p12pwwhknu3gr4h/info.log?dl=1

[PICA8-P3297] dl-dst output #1 OFPFlowMod(actions=[OFPActionOutput(max_len=65509,port=45)],buffer_id=4294967295,command=0,cookie=16895774056056650001,flags=0,hard_timeout=0,idle_timeout=0,match=OFPMatch(dl_dst=b'\xa0-\xfc\xa3\xf8\xd9',dl_src=b'\x00\x00\x00\x00\x00\x00',dl_type=0,dl_vlan=0,dl_vlan_pcp=0,in_port=0,nw_dst=0,nw_proto=0,nw_src=0,nw_tos=0,tp_dst=0,tp_src=0,wildcards=4194295),out_port=65535,priority=1)

我打开并通过此行获取文件中的dl_dst值:

dl_dst = fm_line.split('OFPMatch')[1].split(',')[0].split('=')[1]

dl_dst应该是Mac地址。我的问题是如何转换?

根据建议,我尝试了:

print(''.join(["{0:x}".format(ord(char)) for char in dl_dst[2:-1]]))

但是打印的结果是275c5c7861302d5c5c7866635c5c7861335c5c7866385c5c78643927,这不是我期望的

1 个答案:

答案 0 :(得分:2)

假设a是转义的str,应该可以得到想要的结果。

a = "b'\xa0-\xfc\xa3\xf8\xd9'"
res = ["{0:x}".format(ord(char)) for char in a[2:-1]]
res = ''.join(res)
print(res) # a02dfca3f8d9

注意:
a[2:-1]从输入b'中删除'str
ord()返回Unicode字符的整数。
{0:x}返回给定str的{​​{1}}十六进制表示形式。
int将整个列表变成一个''.join

那可以是一行,但是为了方便和可读起见,我将其保留为两个。

请注意,您可能应该修复您的源,这样它才不会以这种方式输出(它不应将str输出到文件中。)


-编辑-

由于您有原始的b'...',因此需要以其他方式进行操作。无需进行拆分以从您的str获取MAC地址,而只需使用正则表达式(麻烦较少),您的文件也将以原始字符串读取,这意味着fm_line被转义了,因此您需要进行修复。此解决方案适用于原始或转义的字符串。

\