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

Python 如何解码定义为字符串的十六进制字节?,python,string,hex,byte,decode,Python,String,Hex,Byte,Decode,我读取文件中打印的字节,作为字符串: a = "b'\xa0-\xfc\xa3\xf8\xd9'" 类型(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 我应该如何解码 解码值应为a02dfca3f8d9 文件的一部分上载到此处: 我打开并通过此行获取文件中的dlds

我读取文件中打印的字节,作为字符串:

a = "b'\xa0-\xfc\xa3\xf8\xd9'" 
类型(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
我应该如何解码

解码值应为
a02dfca3f8d9

文件的一部分上载到此处:

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

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
,这不是我期望的

假设
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]
从输入
str
中删除
b'
'

ord()
返回unicode字符的整数。
{0:x}
返回给定
int
str
十六进制表示形式
'.join
将整个列表变成一个
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
这可以是单行的,但为了方便和可读性,我将其保留为两行

注意,您可能应该修复源代码,使其不会以这种方式输出(它不应该将
b'…'
输出到文件)


-编辑-

由于您有一个原始的
str
,因此需要以不同的方式执行。不必通过拆分从
fm\u行
获取MAC地址,只需使用regex(减少麻烦),而且您的文件正在读取原始字符串,这意味着
\
将被转义,因此您需要修复该问题。此解决方案适用于原始字符串或转义字符串

import re
import ast
get_mac = re.compile(r"dl_dst=b'(.+?)',") # This should be outside of your loop.
result = get_mac.search(fm_line) # This you will call for each line that you need to parse
if result:
    address = ast.literal_eval(f"'{result.group(1)}'") # This will turn your raw `str` in an escaped `str`
    res = ["{0:x}".format(ord(char)) for char in address]
    res = ''.join(res)
    print(res)

这似乎不是一个有效的字节字符串,您从哪里得到它的?这个字符串是如何产生的:
a=“b'\xa0-\xfc\xa3\xf8\xd9'
?看起来有人有一个bytes对象,然后将bytes对象的字符串表示形式写入了一个文件。你应该解决这个问题。不能解码字符串,可以将字符串编码为字节,将字节解码为字符串。您可以在此处使用
eval
来获取该字符串表示的字节。请添加打断我的解决方案的行。您的解决方案不会中断,但不会给出正确的答案(仅当我从文件中读取值时)。谢谢,如果我在代码中定义“a”,它会起作用。但是如果我从文件中读取“a”,则输出为5c7861302d5c7866635c7861335c7866385c786439,这是不正确的!在调试模式下,“a”的值为“b\\\\\\xa0-\\xfc\\xa3\\xf8\\xd9\\''。OpenFlow交换机正在创建此文件,此值应为Mac地址(a0:2d:fc:a3:f8:d9)。你能用这个值制作一个测试文件并尝试读取它吗?我觉得很奇怪为什么你的脚本不起作用!我在问题中添加了文件的一部分。@AmirVarasteh请查看我的编辑。谢谢您的编辑!输出仍然不正确“5c7861302d5c7866635c7861335c7866385c786439”