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
)。
这是一个重复的问题,但我找不到答案
我正在读取以下格式的二进制文件(仅以十六进制格式显示 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
)。