为什么 bytes.fromhex() 奇怪地对待一些十六进制值?

Jim*_*Jim 2 python hex python-3.x

我正在尝试使用 python 中的套接字库将两个十六进制数字的字节发送到一个编程为接受它们的硬件。要从用户输入的十六进制数字字符串创建字节,我正在尝试使用这里描述的 bytes.fromhex() 类方法:https ://docs.python.org/dev/library/stdtypes.html#bytes.fromhex

为什么会出现以下情况:

hexstring = "bb 0D 02 55 55 5A ce"
data = bytes.fromhex(hexstring)
print(data)
Run Code Online (Sandbox Code Playgroud)

给我吗:

b'\xbb\r\x02UUZ\xce'
Run Code Online (Sandbox Code Playgroud)

代替:

b'\xbb\x0d\x02\x55\x55\x5a\xce'
Run Code Online (Sandbox Code Playgroud)

?

我如何让它给我第二个输出?我正在使用 python 3.5。

Mar*_*ers 6

这与bytes.fromhex(). 如果您将预期结果输入 Python,您会得到相同的结果:

>>> b'\xbb\x0d\x02\x55\x55\x5a\xce'
b'\xbb\r\x02UUZ\xce'
Run Code Online (Sandbox Code Playgroud)

在可能的情况下repr()bytes对象的表示将始终使用 ASCII 可打印字符和短的单字母转义序列。

所以 \x0d显示为\r,因为这是回车的 ASCII 代码点。\x55是可打印的 ASCII 字符U等。

如果这对您来说是个问题,您必须bytes再次将您的值显式转换为十六进制:

>>> b'\xbb\r\x02UUZ\xce'.hex()
'bb0d0255555ace'
Run Code Online (Sandbox Code Playgroud)