如何将二进制文件缓冲区解压成两个变量?

2024-10-02 18:25:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个二进制文件,它包含4个字节的二进制值,每个值代表一组两个short int。我知道我可以将一个4字节的二进制值解压为两个短整数,如下所示:

from struct import unpack

fval = b'\xba\x1e\x99\x01' #actualy read from some file
qualdip, azi = unpack('hh', fval)
print(type(qualdip), qualdip)
print(type(azi), azi)

>>> <class 'int'> 7866
>>> <class 'int'> 409

现在,我要打开整个缓冲区。目前我正在做的是:

^{pr2}$

对于一个277MB的文件来说,这需要一分钟的时间,并且似乎会产生巨大的内存开销。在

我想将整个filebuffer直接解压到两个变量中。我该怎么做?在

我怀疑^{}是我的朋友,但我不确定如何制定格式。在

with open(bfile, 'rb') as buf:
    qualdip, azi = unpack_from('hh', buf)

只提取两个值,和(我知道文件的元素数)

with open(bfile, 'rb') as buf:
    qualdip, azi = unpack_from('72457091h72457091h', buf)

期望有如此多的输出变量。所以:

如何将整个filebuffer直接解压到两个变量中?在


Tags: 文件from字节hhtype二进制classint
2条回答

我不知道如何将值直接解压到两个列表中,但您可以将整个文件解压为一个元组,然后将其分成两部分:

fval = b'\xba\x1e\x99\x01' * 3
unpacked= unpack('3h3h', fval)
qualdip = unpacked[0::2]
azi = unpacked[1::2]

或者,使用^{}创建一个iterator,这将减少内存消耗。在

^{pr2}$

我认为这可能是一种更快的方法:

import os
import struct

def pairwise(iterable):
    "s -> (s0,s1), (s2,s3), (s4, s5), ..."
    a = iter(iterable)
    return zip(a, a)

bfile = 'bfile.bin'
filesize = os.stat(bfile).st_size
numvals = filesize // 2

with open(bfile, 'rb') as bf:
    fmt = '{}h'.format(numvals)
    values = struct.unpack(fmt, str(bf.read()))

qualdips, azis = zip(*pairwise(values))

相关问题 更多 >