我正在测试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'
但这些例子显然不是:
>>> 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'
我将不胜感激任何解释或提示。先谢谢!
答案 0 :(得分:6)
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'
,它返回字节为十六进制字符(没有前缀)。返回值当然不再是相同的值,您现在有一个原始长度的两倍的字节串,由表示十六进制值的字符组成,文字a
到f
和0
到9
个字符。
答案 1 :(得分:1)
"\xNN"
只是表示不可打印字符的方式...如果可以,它将为您提供可打印的字符
print "\x0a" == "\n" == chr(10)