Python 3 struct.pack()打印奇怪的字符

Mit*_*aul 1 python serialization pack python-3.x

我正在测试struct模块,因为我想将带有参数的简单命令(字节(char)和unsigned int)发送到另一个应用程序.

但是,在转换为little endian unsigned int时,我发现了一些奇怪的东西,这些示例打印正确的十六进制表示:

>>> import struct
>>> struct.pack('<I',7)
b'\x07\x00\x00\x00'
>>> struct.pack('<I',11)
b'\x0b\x00\x00\x00'
>>> struct.pack('<I',16)
b'\x10\x00\x00\x00'
>>> struct.pack('<I',15)
b'\x0f\x00\x00\x00'
Run Code Online (Sandbox Code Playgroud)

但这些例子显然不是:

>>> struct.pack('<I',10)
b'\n\x00\x00\x00'
>>> struct.pack('<I',32)
b' \x00\x00\x00'
>>> struct.pack('<I',64)
b'@\x00\x00\x00'
Run Code Online (Sandbox Code Playgroud)

我将不胜感激任何解释或提示.先谢谢!

Mar*_*ers 7

Python很有帮助.

bytes表示将使用ASCII字符表示可打印的任何字节,其余部分使用转义码.

因此,0x40被打印为@,因为这是一个可打印的字节.但是0x0a表示为\n,因为这是换行符的标准Python转义序列.0x00表示为\x00表示NULL字节值的十六进制转义序列.等等.

所有这些只是回显值时的Python表示,以获得调试优势.实际值本身仍然包含实际字节值.

>>> b'\x40' == b'@'
True
>>> b'\x0a' == b'\n'
True
Run Code Online (Sandbox Code Playgroud)

只是可打印ASCII范围内的任何字节都将显示为ASCII字符,而不是\xhh十六进制转义\c符或专用的单字符转义序列.

如果你想看到的只有十六进制表示,使用binascii.hexlify()功能:

>>> import binascii
>>> binascii.hexlify(b'@\x00\x00\x00')
b'40000000'
>>> binascii.hexlify(b'\n\x00\x00\x00')
b'0a000000'
Run Code Online (Sandbox Code Playgroud)

它将字节作为十六进制字符(没有前缀)返回.返回值是当然不再是相同的值,你现在有两次代表组成的十六进制值,文字字符的原始长度的字节串a通过对f0通过对9人物.