首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python3 struct.pack()打印奇怪字符

Python3 struct.pack()打印奇怪字符
EN

Stack Overflow用户
提问于 2014-01-10 18:48:44
回答 2查看 2.5K关注 0票数 4

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

然而,在转换为小endian无符号int时,我发现了一些奇怪的事情,这些示例打印了正确的十六进制表示:

代码语言:javascript
复制
>>> 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'

但这些例子显然不是:

代码语言:javascript
复制
>>> 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'

如有任何解释或暗示,我将不胜感激。事先谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-10 18:49:55

Python很有帮助。

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

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

所有这些都只是Python在回显值时的表现形式,这对您的调试有好处。实际值本身仍然由实际字节值组成。

代码语言:javascript
复制
>>> b'\x40' == b'@'
True
>>> b'\x0a' == b'\n'
True

只是,可打印的ASCII范围中的任何字节都将显示为ASCII字符,而不是\xhh十六进制转义或专用的\c单字符转义序列。

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

代码语言:javascript
复制
>>> import binascii
>>> binascii.hexlify(b'@\x00\x00\x00')
b'40000000'
>>> binascii.hexlify(b'\n\x00\x00\x00')
b'0a000000'

它以十六进制字符的形式返回字节(没有前缀)。返回值当然不再是相同的值,您现在的字节串是原来长度的两倍,由表示十六进制值的字符组成,文本a通过f0通过9字符。

票数 9
EN

Stack Overflow用户

发布于 2014-01-10 18:49:53

"\xNN"只是用来表示不可打印字符的方式.如果可以的话,它会给你一个可打印的字符

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21052068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档