gpt4 book ai didi

python - Python 中的结构和解包

转载 作者:太空宇宙 更新时间:2023-11-03 11:04:34 25 4
gpt4 key购买 nike

我一直在努力理解拆包的工作原理。更具体地说,文档中的这个特定示例最让我感到困惑,因为当我完全相同地输入它时,它不会给我相同的输出。 https://docs.python.org/2/library/struct.html#struct-examples

>>> from struct import *
>>> pack('hhl', 1, 2, 3)
'\x00\x01\x00\x02\x00\x00\x00\x03'
>>> unpack('hhl', '\x00\x01\x00\x02\x00\x00\x00\x03')
(1, 2, 3)
>>> calcsize('hhl')
8

8 字节大小是有意义的,但是当我执行 calcsize('hhl') 时它返回 16。将 pack('hhl', 1, 2, 3) 作为变量存储并解包它工作正常但使用十六进制值不.我收到错误消息“unpack requires a string argument of length 16”,知道问题出在哪里吗?谢谢

最佳答案

这是因为当你这样做的时候:

>>> pack('hhl', 1, 2, 3)
'\x00\x01\x00\x02\x00\x00\x00\x03'

它不是返回带有 [ \, x, 0, ...] 的字符串,而是一个包含以十六进制给出的每个数字的字节数组:

>>> pack('hhl', 1, 2, 3)[0]
'\x00'

所以,当你在做的时候:

>>> unpack('hhl', '\x00\x01\x00\x02\x00\x00\x00\x03')

您实际上是在尝试像我之前所说的那样解压一个字符串。而如果您这样做:

>>> s = pack('hhl', 1, 2, 3)
'\x00\x01\x00\x02\x00\x00\x00\x03'
>>> unpack('hhl', s)
(1, 2, 3)

它按预期工作。

正如@falstru 所说,将十六进制字符串转换为结构可以理解的字节数组的方法是使用 binascii.unhexlify,它处理字节顺序和转换。你也可以自己做:

>>> unpack('hhl', str(bytearray([1,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0])))
(1, 2, 3)

关于python - Python 中的结构和解包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23634693/

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