[英]Unpacking 4-byte unsigned integers from binary file gives struct.error: unpack requires a buffer of 4 bytes
这是一个重复的问题,但我找不到答案
我正在读取以下格式的二进制文件(仅显示 3000 行十六进制格式之一,如 sublime text 所示):
0009 7f71 0009 b87b 0009 f24b 000a 2ce2
我想将它读作 4 字节无符号整数的元组
if filename:
with open(filename, mode='rb') as file:
fileData = file.read()
unsignedData = struct.unpack('I', fileData )
但是,我在上面的代码中的最后一行出现以下错误:
struct.error: unpack requires a buffer of 4 bytes
如何解决这个问题?
io.RawIOBase.read
通常会返回超过 4 个字节(它受系统调用和/或文件大小的限制)。
另一方面,缓冲区的字节大小必须与struct.unpack
格式字符串所需的大小相匹配。
您的文件的整体数据结构尚不清楚,但例如,要读取以 little-endian 编码的 4 个无符号 32 位整数(您提供的数据),您应该对缓冲区进行切片:
unsignedData = struct.unpack('4I', fileData[:16])
如果您需要从文件中解码任意长的整数流,有几个选项,具体取决于预期的数据长度。
with open(filename, mode='rb') as fp:
fileData = fp.read()
n, r = divmod(len(fileData), struct.calcsize('I'))
assert r == 0, "Data length not a multiple of int size"
unsignedData = struct.unpack('I' * n, fileData)
您可以使用struct.iter_unpack
,但无论如何将大型 int 数据保存在array.array
或numpy.array
可能更有意义。
这是 NumPy 数组的示例:
import numpy
data = numpy.fromfile(filename, dtype='uint32')
我将把加载到 Python 的同构数据数组中作为练习array.fromfile
读者(提示: array.fromfile
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.