从模拟工具中我得到一个包含一些测量点的二进制文件。我需要做的是:解析测量值并将它们存储在列表中。
根据该工具的文档,该文件的数据结构如下所示:
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
绘制第一个数量。正如您在附图中看到的那样,在解析过程中出了问题。
但我无法找到我的错。
答案 0 :(得分:0)
今天早上我能够解决我的问题。
解决方案不容易。
我改变了
...
with open(ergFilePath, 'r') as ergFile:
...
为:
...
with open(ergFilePath, 'rb') as ergFile:
...
注意从'r'到'rb'的变化为模式。
python纪录片让我明白了事情:
因此,打开二进制文件时,应将'b'附加到模式 以二进制模式打开文件的值,这将提高可移植性。 (附加'b'即使在不处理二进制和 文本文件不同,它用作文档。)
所以最终解析的值如下所示: