Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 存储';结构';将数据转换为二进制文件_Python_Header Files_Binaryfiles - Fatal编程技术网

Python 存储';结构';将数据转换为二进制文件

Python 存储';结构';将数据转换为二进制文件,python,header-files,binaryfiles,Python,Header Files,Binaryfiles,我需要存储一个包含4个字段的12字节头的二进制文件。它们分别是:sSamples(4字节整数)、sSampPeriod(4字节整数)、sSampSize(2字节整数)和sParmKind(2字节整数)。 我正在使用“struct”将变量转换为所需的字段。现在我已经分别定义了它们,如何合并它们来存储“12字节头” sSamples = struct.pack('i', nSamples) # 4-bytes integer sSampPeriod = struct.pack(

我需要存储一个包含4个字段的12字节头的二进制文件。它们分别是:sSamples(4字节整数)、sSampPeriod(4字节整数)、sSampSize(2字节整数)和sParmKind(2字节整数)。 我正在使用“struct”将变量转换为所需的字段。现在我已经分别定义了它们,如何合并它们来存储“12字节头”

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的浮点数组(
numpy.ndarray
-float32)。如何将该向量存储在同一个二进制文件中,但在头之后

struct.pack
返回一个字符串,因此您可以通过字符串连接简单地组合字段:

header = sSamples + sSampPeriod + sSampSize + sParmKind
assert len( header ) == 12

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

header = struct.pack('<iiHH', nSamples, nSampPeriod, nSampSize, nParmKind)
编辑:哎呀,数组格式并没有那么简单:)不过,总的想法是:使用您喜欢的任何方法将数组展平为一个数字列表,打包值的数量,然后打包每个值。另一方面,以平面列表的形式读取数组,然后对其施加所需的任何结构

编辑:将格式字符串更改为使用重复说明符,而不是字符串乘法。感谢约翰·梅辛指出这一点


编辑:添加了
numpy
代码,以便在打包前展平数组,并在解包后重建数组。

请注意,您可以一次打包多个值:struct.pack('Hi',foo,bar)。另外,你应该写一个“>”或“你好,谢谢你的建议!要将头文件存储到二进制文件,它类似于:binfile=open('myfile.dat','wb')binfile.write(头文件),然后,如何将'npVect'变量附加到'binfile'?这正是将值写入文件的正确方法。我不熟悉numpy,所以我会让其他人对此发表评论。
“+1很好的一点,我忘了你可以在里面放数字。但是,如果数组非常大,由于tuple对数组进行解包,您仍将向
pack
传递许多参数,并从中返回一个巨大的字符串。这两点都指向了如果性能受到足够的影响,就要找到替代
struct
的方法。大家好,我遵循的建议是:arrSize=len(arr)packed=struct.pack('我的数组类型是np.ndarray of float。我需要从float转换为4字节数组。我不完全理解压缩值的数量然后再压缩每个值的建议。是不是这样的情况,我们没有np.narray,而是有一个普通的python列表,对吗?因此,如果是python列表,我必须迭代向量&然后调用:myElem=struct.pack('f',myFlattedArr[i])binfile.write(myElem)?这就是你们所说的吗?谢谢,你们必须将数据数组转换成一维结构,比如列表或元组。但你们不必迭代向量;这就是格式字符串和
*arr
中的
%d
的作用。如果
arr
是17个浮点的列表,那么
struct.pack('
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)
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
    )