我正在测试 struct 模块,因为我想将带有字节(char)和 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'
但这些例子显然不是:
>>> 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'
我将不胜感激任何解释或提示。预先感谢!
Python 很有帮助。
The bytes
表示将对任何可打印的字节使用 ASCII 字符,并对其余字节使用转义码。
因此,0x40 被打印为@
,因为这是一个可打印的字节。但0x0a
表示为\n
相反,因为这是换行符的标准 Python 转义序列。 0x00 表示为\x00
,表示 NULL 字节值的十六进制转义序列。 ETC。
所有这些只是回显值时的 Python 表示形式,以方便您进行调试。实际值本身仍然由实际字节值组成。
>>> b'\x40' == b'@'
True
>>> b'\x0a' == b'\n'
True
只是可打印 ASCII 范围内的任何字节都将显示为该 ASCII 字符而不是\xhh
十六进制转义或专用\c
单字符转义序列。
如果你想看only十六进制表示,使用binascii.hexlify()
功能:
>>> import binascii
>>> binascii.hexlify(b'@\x00\x00\x00')
b'40000000'
>>> binascii.hexlify(b'\n\x00\x00\x00')
b'0a000000'
相反,它将字节返回为十六进制字符(没有前缀)。返回值当然不再是相同的值,您现在有一个原始长度两倍的字节串,由表示十六进制值的字符、文字组成a
通过到f
and 0
通过到9
人物。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)