我以字符串形式读取文件中的打印字节:
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
,这不是我期望的 。
答案 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
被转义了,因此您需要进行修复。此解决方案适用于原始或转义的字符串。
\