我试图读取包含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?
答案 0 :(得分:3)
引用文档:
注意默认情况下,打包给定C结构的结果包括填充字节,以便维护所涉及的C类型的正确对齐;类似地,在拆包时考虑对齐。选择此行为,以便打包结构的字节与相应C结构的内存中的布局完全对应。要处理与平台无关的数据格式或省略隐式填充字节,请使用标准大小和对齐而不是本机大小和对齐:有关详细信息,请参阅Byte Order, Size, and Alignment。
如果您希望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