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

Python 3 struct.pack()打印奇怪字符,python,serialization,python-3.x,pack,Python,Serialization,Python 3.x,Pack,我正在测试struct模块,因为我想向另一个应用程序发送带有字节(char)参数和无符号int的简单命令 然而,我在转换为小尾端无符号整数时发现了一些奇怪的事情,这些示例打印了正确的十六进制表示: >>> import struct >>> struct.pack('<I',7) b'\x07\x00\x00\x00' >>> struct.pack('<I',11) b'\x0b\x00\x00\x00' >>>

我正在测试struct模块,因为我想向另一个应用程序发送带有字节(char)参数和无符号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'
导入结构 >>>struct.pack('
“\xNN”
只是表示不可付费字符的一种方式……如果可以,它将为您提供可付费字符


print“\x0a”==“\n”==chr(10)

Python很有帮助

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

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

为了便于调试,所有这些只是在回显值时的Python表示形式。实际值本身仍然由实际字节值组成

>>> b'\x40' == b'@'
True
>>> b'\x0a' == b'\n'
True
只是可打印ASCII范围内的任何字节都将显示为该ASCII字符,而不是一个十六进制转义或专用的一个字符转义序列

如果只想查看十六进制表示,请使用
binascii.hexlify()
函数:

>>> import binascii
>>> binascii.hexlify(b'@\x00\x00\x00')
b'40000000'
>>> binascii.hexlify(b'\n\x00\x00\x00')
b'0a000000'

以十六进制字符形式返回字节(不带前缀)返回值当然不再是相同的值,现在有了一个长度为原始长度两倍的bytestring,由代表十六进制值的字符组成,literal
a
f
0
9
字符。

解释得很好!我现在忘记了ascii字符这是有道理的
>>> import binascii
>>> binascii.hexlify(b'@\x00\x00\x00')
b'40000000'
>>> binascii.hexlify(b'\n\x00\x00\x00')
b'0a000000'