解析二进制数据时出现问题

时间:2016-12-16 18:06:39

标签: python parsing numpy binary

从模拟工具中我得到一个包含一些测量点的二进制文件。我需要做的是:解析测量值并将它们存储在列表中。

根据该工具的文档,该文件的数据结构如下所示:

First 16 bytes are always the same:

Bytes   0 - 7   char[8]     Header
Byte    8       u. char     Version
Byte    9       u. char     Byte-order (0 for little endian)
Bytes   10 - 11 u. short    Record size
Bytes   12 - 15 char[4]     Reserved

The quantities are following: (for example one double and one float):

Bytes   16 - 23 double      Value of quantity one
Bytes   24 - 27 float       Value of quantity two

Bytes   28 - 35 double      Next value of quantity one
Bytes   36 - 39 float       Next value of quantity two

我也知道,编码是小端。

在我的用例中有两个数量,但它们都是浮点数。

到目前为止我的代码看起来像这样:

def parse(self, filePath):
    infoFilePath = filePath+ '.info'
    quantityList = self.getQuantityList(infoFilePath)

    blockSize = 0
    for quantity in quantityList:
        blockSize += quantity.bytes

    with open(filePath, 'r') as ergFile:
        # read the first 16 bytes, as they are not needed now
        ergFile.read(16)

        # now read the rest of the file block wise
        block = ergFile.read(blockSize)
        while len(block) == blockSize:
            for q in quantityList:
                q.values.append(np.fromstring(block[:q.bytes], q.dataType)[0])
                block = block[q.bytes:]
            block = ergFile.read(blockSize)

    return quantityList

QuantityList来自之前的函数,包含数量结构。每个数量都有一个名称,dataType,lenOfBytes,称为bytes,以及一个名为values的值的准备列表。

所以在我的用例中有两个数量:

dataType = "<f"
bytes = 4
values=[]

解析功能完成后,我用matplotlib绘制第一个数量。正如您在附图中看到的那样,在解析过程中出了问题。

我的解析值: My parsed values

参考: The reference

但我无法找到我的错。

1 个答案:

答案 0 :(得分:0)

今天早上我能够解决我的问题。

解决方案不容易。

我改变了

...
with open(ergFilePath, 'r') as ergFile:
...

为:

...
with open(ergFilePath, 'rb') as ergFile:
...

注意从'r'到'rb'的变化为模式。

python纪录片让我明白了事情:

  

因此,打开二进制文件时,应将'b'附加到模式   以二进制模式打开文件的值,这将提高可移植性。   (附加'b'即使在不处理二进制和   文本文件不同,它用作文档。)

所以最终解析的值如下所示:

Final values