gpt4 book ai didi

python - 如何将二进制文件缓冲区解包为两个变量?

转载 作者:太空宇宙 更新时间:2023-11-03 16:20:39 25 4
gpt4 key购买 nike

我有一个二进制文件,其中包含 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

现在,我想解压整个缓冲区。目前我正在做:

qualdips = []
azis = []
with open(bfile, 'rb') as buf:
fval = buf.read(4)
while fval:
qualdip, azi = unpack('hh', fval)
azis.append(azi)
qualdips.append(qualdip)
fval = buf.read(4)

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

我想将整个文件缓冲区直接解压到两个变量中。我该如何实现这个目标?

我怀疑struct.unpack_from是我的 friend ,但我不确定如何制定格式。

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

仅提取两个值,并且(我知道文件的元素数量)

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

期望输出变量的数量如此荒谬。所以:

如何将整个文件缓冲区直接解压到两个变量中?

最佳答案

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

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

或者,使用 islice创建 iterator ,这将减少内存消耗。

qualdip = islice(unpacked, 0, None, 2)
azi = islice(unpacked, 1, None, 2)

关于python - 如何将二进制文件缓冲区解包为两个变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38507704/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com