gpt4 book ai didi

python - 将 'struct'数据存储到二进制文件

转载 作者:行者123 更新时间:2023-11-30 23:58:15 24 4
gpt4 key购买 nike

我需要存储一个二进制文件,其头由 4 个字段组成,长度为 12 字节。它们分别是:sSamples(4 字节整数)、sSampPeriod(4 字节整数)、sSampSize(2 字节整数)和最后的 sParmKind(2 字节整数)。我正在使用“结构”将变量添加到所需的字段。现在我已经分别定义了它们,如何将它们全部合并以存储“12 字节 header ”?

sSamples        = struct.pack('i', nSamples) # 4-bytes integer
sSampPeriod = struct.pack('i', nSampPeriod) # 4-bytes integer
sSampSize = struct.pack('H', nSampSize) # 2-bytes integer / unsigned short
sParmKind = struct.pack('H', 9) # 2-bytes integer / unsigned short

此外,我还有一个维度为 D 的 npVect float 组(numpy.ndarray - float32)。如何将此向量存储在同一个二进制文件中,但位于 header 之后?

最佳答案

正如 Cody Brocious 所写,您可以一次打包整个 header :

header = struct.pack('<iiHH', nSamples, nSampPeriod, nSampSize, nParmKind)

他还提到了字节顺序,如果您想打包数据以便在具有不同架构的机器上可靠地解包它,那么字节顺序非常重要。 <在我的格式字符串的开头指定“使用小端约定打包此数据”。

对于数组,您必须压缩它的长度,以便确定再次读取它时要解压缩多少个值。一次调用即可完成所有操作:

flattened = npVect.ravel()  # get a 1-D array of numbers
arrSize = len(flattened)
# pack header, count of numbers, and numbers, all in one call
packed = struct.pack('<iiHHi%df' % arrSize,
nSamples, nSampPeriod, nSampSize, nParmKind, arrSize, *flattened)

根据您的数组可能有多大,您最终可能会得到一个代表二进制文件全部内容的巨大字符串,并且您可能需要研究 struct 的替代方案。这不需要您将整个文件存储在内存中。

拆包:

fmt = '<iiHHi'
nSamples, nSampPeriod, nSampSize, nParmKind, arrSize = struct.unpack(fmt, packed)
# Use unpack_from to start reading after the packed header and count
flattened = struct.unpack_from('<%df' % arrSize, packed, struct.calcsize(fmt))
npVect = np.ndarray(flattened, dtype='float32').reshape(# your dimensions go here
)

编辑:哎呀,数组格式并不那么简单:)不过,总体思路是这样的:使用您喜欢的任何方法将数组展平为数字列表,打包值的数量,然后打包每个值。另一方面,将数组作为平面列表读取,然后对其施加所需的任何结构。

编辑:更改格式字符串以使用重复说明符,而不是字符串乘法。感谢 John Machin 指出了这一点。

编辑:已添加numpy代码在打包前压平数组并在解包后重建数组。

关于python - 将 'struct'数据存储到二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3164957/

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