Unpacking 4-byte unsigned integers from binary file gives struct.error: unpack requires a buffer of 4 bytes

Unpacking 4-byte unsigned integers from binary file gives struct.error: unpack requires a buffer of 4 bytes

这是一个重复的问题,但我找不到答案

我正在读取以下格式的二进制文件(仅以十六进制格式显示 3000 行之一,如 sublime 文本所示):

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 通常会 return 超过 4 个字节(它受限于系统调用 and/or 文件大小)。

另一方面,缓冲区的大小(以字节为单位)必须与格式字符串所需的大小相匹配 struct.unpack

你的文件整体数据结构不清晰,但是,例如读取4个无符号的32位整数,以little-endian编码(你提供的数据),你应该切片缓冲区:

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, but it probably makes more sense to keep the large int data in an array.array or numpy.array

这是一个 NumPy 数组的例子:

import numpy
data = numpy.fromfile(filename, dtype='uint32')

我将把加载到 Python 的同构数据数组作为 reader 的练习(提示:array.fromfile)。