我正在测试struct模块,因为我希望向另一个应用程序发送带有字节(char)和无符号int参数的简单命令。
然而,在转换为小endian无符号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'如有任何解释或暗示,我将不胜感激。事先谢谢!
发布于 2014-01-10 18:49:55
Python很有帮助。
bytes表示将对可打印的任何字节使用ASCII字符,对其余的字节使用转义代码。
因此,0x40被打印为@,因为这是一个可打印的字节。但是0x0a被表示为\n,因为这是换行符的标准转义序列。0x00表示为\x00,表示空字节值的十六进制转义序列。等。
所有这些都只是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'它以十六进制字符的形式返回字节(没有前缀)。返回值当然不再是相同的值,您现在的字节串是原来长度的两倍,由表示十六进制值的字符组成,文本a通过f,0通过9字符。
发布于 2014-01-10 18:49:53
"\xNN"只是用来表示不可打印字符的方式.如果可以的话,它会给你一个可打印的字符
print "\x0a" == "\n" == chr(10)
https://stackoverflow.com/questions/21052068
复制相似问题