尝试从二进制文件中提取特定字节的数据时,从 struct.unpack 中获取缓冲区大小错误

大卫 K。

我正在使用struct.unpack()从二进制文件中收集特定数据。

point4, = struct.unpack("B", data[3:4])
point5, = struct.unpack("H", data[4:6])

point4 预计为 Uchar,point5 预计为 Ushort。每个https://docs.python.org/3/library/struct.html使用格式字符

以上工作正常,并正确收集预期数据。但是,如果我尝试将两个语句组合成类似的内容:point4, point5, = struct.unpack("BH", data[3:6]),我会收到以下异常错误:unpack requires a buffer of 4 bytes这让我感到惊讶,因为我已经能够使用如下组合语句成功提取相同的数据以及更多数据:

point1, point2, point3, point4, point5, = struct.unpack("BBBBH", data[0:6])

我不确定为什么point4, point5, = struct.unpack("BH", data[3:6])会给我一个错误,但我想在一行而不是两行中获取这些数据。

马蒂诺

问题是data[3:6]只有 3 个字节长,但默认情况下格式"BH"需要 4 个字节,因为假定默认对齐与填充。你可以用一个来证明这一点:

print(f'{struct.Struct("BH").size=}')  # -> 4

请参阅模块文档字节顺序、大小和对齐部分struct

您可以通过显式指定字节顺序来覆盖它。IE

point4, point5 = struct.unpack("=BH", data[3:6])  # No error.

另请注意,没有理由在赋值表达式的左侧在代码中使用多余的逗号。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Python struct.unpack二进制文件

尝试从二进制文件读取数据,但无法将其放入struct中

python struct unpack length错误

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

如何使用struct.unpack从python 3中的字节列表中提取int?

从二进制文件解包 4 字节无符号整数给出 struct.error:解包需要 4 字节的缓冲区

struct.unpack() 需要来自具有特定格式模式的字节对象的错误长度

Python Struct.Unpack中的对齐/打包

导致TypeError:'int'的struct.unpack不支持缓冲区接口

Kotlin:编码和解码二进制结构数据(Kotlin 等效于 Python 的 struct.pack 和 struct.unpack)

PHP中的文件大小错误

struct unpack(类型错误:需要像对象这样的字节,而不是'str“),解压缩列表?

使用Python的struct.unpack时是否可以跳过字节?

Java中的二进制搜索小错误

ORA-06502:PL/SQL:数值或值错误:处理多字节字符时字符串缓冲区太小错误

Python 2.7与3.6中struct.unpack的行为差异

等价于Python的C#中的“ struct.pack / unpack”吗?

struct.pack "Hq" 的编码大小错误

在协议缓冲区消息中存储二进制数据缓冲区

struct.unpack(struct.pack(float))是否具有舍入错误?

读取二进制文件并将其存储到C中的struct

加快python的struct.unpack

unpack_from需要至少1164字节的缓冲区

C ++获取缓冲区的二进制值

将缓冲区数据解析为struct

分配给struct中的静态数组时,堆缓冲区溢出

在VB.NET中读取时,从文件中排除二进制数据的前“ x”个字节

使用 struct.unpack_from 解析特定图像时返回奇怪的值

将二进制数据写入缓冲区