Python 3.8 结构解包 - struct.error: unpack 需要 1 个字节的缓冲区

Posted

技术标签:

【中文标题】Python 3.8 结构解包 - struct.error: unpack 需要 1 个字节的缓冲区【英文标题】:Python 3.8 Struct unpacking - struct.error: unpack requires a buffer of 1 bytes 【发布时间】:2020-05-11 01:53:47 【问题描述】:

我试图在 Python 3.8 中解压 python 结构并得到错误

TypeError: 需要一个类似字节的对象,而不是 'int'

。相同的代码在 Python 2.7 中运行良好

import struct
hexval= b'J\xe6\xe7\xa8\x002\x10k\x05\xd4\x7fA\x00\x04\n\x90\x1a\n'

aaT = struct.unpack('>H',hexval[4:6])
aa = aaT[0] 
print("aa",aa)                      

bbT = struct.unpack(">B",hexval[12])
bb = bbT[0]&0x3      # just lower 2 bits
print("bb",bb)

输出:

aa 50

Traceback(最近一次调用最后一次): 文件“./sample.py”,第 9 行,在 bbT = struct.unpack(">B",hexval[12]) TypeError:需要一个类似字节的对象,而不是'int'

当我转换为字节时

我得到这样的错误。

Traceback(最近一次调用最后一次):文件“sample.py”,第 9 行,在 bbT = struct.unpack(">B",bytes(hexval[12])) struct.error: unpack 需要 1 个字节的缓冲区

如何解压这个二进制数据

【问题讨论】:

这能回答你的问题吗? Why do I get an int when I index bytes? @MarkMeyer 没有回答这个问题。它只是解释了字节对象是如何工作的。 【参考方案1】:

这是与从 Python 2 到 3 的数据类型相关的另一个变化。原因在 Why do I get an int when I index bytes? 的答案中进行了解释

以防万一答案不明显,要获得与 Python 2 相同的结果,请改为:

bbT = struct.unpack(">B",hexval[12:13]) # slicing a byte array results in a byte array, same as Python 2

【讨论】:

以上是关于Python 3.8 结构解包 - struct.error: unpack 需要 1 个字节的缓冲区的主要内容,如果未能解决你的问题,请参考以下文章

qt中如何解包利用python 的struct.pack()函数打包的数据

使用 struct.unpack_from() 解包混合二进制数据

Python数据结构与算法(10)---二进制数据结构Struct

Python数据结构与算法(10)---二进制数据结构Struct

如何使用 python struct 包仅解包前 6 个字节

Python中struct 模块的使用教程