二进制数据的Python结构

时间:2014-10-14 20:13:28

标签: python file struct binary-data

我试图读取包含float和int16值流的二进制文件。这些值交替存储。

[float] [int16] [float] [int16] ......等等

现在我想使用结构函数通过python程序读取这个数据文件。

为了读取一个这样的float-int16-pair的块,我假设格式字符串是" fh"。 以下输出有意义,总大小为6个字节

In [73]: struct.calcsize('fh')
Out[73]: 6

现在我想立刻阅读更大的块来加速程序...

In [74]: struct.calcsize('fhfh')
Out[74]: 14

为什么这不会返回12?

2 个答案:

答案 0 :(得分:3)

引用文档:

  
    

注意默认情况下,打包给定C结构的结果包括填充字节,以便维护所涉及的C类型的正确对齐;类似地,在拆包时考虑对齐。选择此行为,以便打包结构的字节与相应C结构的内存中的布局完全对应。要处理与平台无关的数据格式或省略隐式填充字节,请使用标准大小和对齐而不是本机大小和对齐:有关详细信息,请参阅Byte Order, Size, and Alignment

         

https://docs.python.org/2/library/struct.html

  

如果您希望calcsize('fhfh')正好两次calcsize('fh'),那么您需要指定一个对齐字符。

请尝试'<fhfh''>fhfh'

答案 1 :(得分:1)

您必须指定字节顺序或Endianness作为大小,并且对齐基于此,所以如果您尝试这样做:

>>> struct.calcsize('fhfh')
>>> 14
>>> struct.calcsize('>fhfh')
>>> 12

原因是因为struct未指定字节序默认为native

有关详情,请点击此处:https://docs.python.org/3.0/library/struct.html#struct.calcsize