gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:20:20 26 4
gpt4 key购买 nike

我正在测试结构模块,因为我想将带有字节 (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'

如果有任何解释或提示,我将不胜感激。提前致谢!

最佳答案

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'

而是将字节作为十六进制字符(没有前缀)返回。返回值当然不再是相同的值,您现在有一个两倍于原始长度的字节串,由表示十六进制值的字符组成,文字 af09 个字符。

关于Python 3 struct.pack() 打印奇怪的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21052068/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com