Python 为什么bytes.fromhex()会奇怪地处理某些十六进制值?

Python 为什么bytes.fromhex()会奇怪地处理某些十六进制值?,python,python-3.x,hex,Python,Python 3.x,Hex,我试图使用python中的套接字库将两个十六进制数字的字节发送到一个编程为接受它们的硬件。要从用户输入的十六进制数字字符串创建字节,我尝试使用bytes.fromhex()类方法,如下所述: 为什么会出现以下情况: hexstring = "bb 0D 02 55 55 5A ce" data = bytes.fromhex(hexstring) print(data) 给我: b'\xbb\r\x02UUZ\xce' 而不是: b'\xbb\x0d\x02\x55\x55\x5a\xce'

我试图使用python中的套接字库将两个十六进制数字的字节发送到一个编程为接受它们的硬件。要从用户输入的十六进制数字字符串创建字节,我尝试使用bytes.fromhex()类方法,如下所述:

为什么会出现以下情况:

hexstring = "bb 0D 02 55 55 5A ce"
data = bytes.fromhex(hexstring)
print(data)
给我:

b'\xbb\r\x02UUZ\xce'
而不是:

b'\xbb\x0d\x02\x55\x55\x5a\xce'
?


我怎样才能得到第二个输出呢?我使用的是python 3.5。

python会自动将可解释为可打印ASCII的字节显示为它们打印的字符。例如,
chr(0x55)==“U”
,因此Python只打印U而不是十六进制代码。它仍然是相同的数据。

这与
字节无关。fromhex()
。如果将预期结果输入Python,则会得到相同的结果:

>>> b'\xbb\x0d\x02\x55\x55\x5a\xce'
b'\xbb\r\x02UUZ\xce'
字节
对象的
repr()
表示将始终尽可能使用ASCII可打印字符和短的单字母转义序列

因此
\x0d
显示为
\r
,因为这是回车的ASCII码点
\x55
是可打印的ASCII字符
U

如果这是您的问题,您必须再次显式地将
字节
值转换为十六进制:

>>> b'\xbb\r\x02UUZ\xce'.hex()
'bb0d0255555ace'

'\x55'
是可打印的ASCII字符
'U'
'\x5A'
是可打印的ASCII字符
'Z'
'\x0D'
是转义字符串
'\r'
常规表示的ASCII字符。如果您想要一个字符串显示
'\x..'
唯一的格式,其中十六进制代码对于每个字符都是显式可见的,那么。。。在
hexstring
中,您已经有了这种功能。不要担心Python控制台如何显示输出字符串——处理其内容可能更为重要,并担心它在任何系统上的显示方式。谢谢。我意识到,尽管它是用ASCII可打印字符和一个字母转义序列显示的,但它仍然以我需要的方式传输。