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

4

我正在测试struct模块,因为我想向另一个应用程序发送带有字节(char)和无符号整数参数的简单命令。

然而,当转换到小端无符号整数时,我发现了一些奇怪的事情,这些示例会打印出正确的十六进制表示:

>>> 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'

但是这些例子显然不行:
>>> 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'

我希望你能提供任何解释或提示。先行感谢!

2个回答

9

Python很有用。

bytes 表示将会使用ASCII字符表示可打印的字节,并使用转义码来表示其余的字节。

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

所有这些都只是Python的表示方式,以便您调试时可以查看值。实际值本身仍然包含实际的字节值。

>>> b'\x40' == b'@'
True
>>> b'\x0a' == b'\n'
True

所谓可打印的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'

该函数以十六进制字符(无前缀)返回字节。返回值当然不再是原始值,而是由表示十六进制值的字符组成的两倍于原始长度的字节字符串,包括文字 af09


讲解得非常好!我忘记了ASCII字符,现在有意义了。 - MithPaul

2

"\xNN"是表示不可打印字符的方式,如果可以的话,它会给你可打印字符。

print "\x0a" == "\n" == chr(10)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接