2016-12-16 9 views
0

シミュレーションツールから、いくつかの測定ポイントを含むバイナリファイルを取得します。私がする必要があるのは、測定値を解析してリストに格納することです。私もエンコーディングはリトルエンディアンであることを、知っているバイナリデータの解析に関する問題

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 

ツールのドキュメントによると、ファイルのデータ構造は次のようになります。

私の用途では2つの数量がありますが、どちらも浮きです。

私のコードは、これまでに次のようになります。

​​

QuantityListは前の関数から来て、数量構成が含まれています。それぞれの数量には、名前とデータ型、lenOfBytesというバイトと、値と呼ばれる値の準備リストがあります。 parse関数は、私がmatplotlibと第1の量をプロットし終えた後

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

は、だから私のユースケースでは2つの量があります。添付された画像から分かるように、解析中に何かが間違っていました。

マイ解析された値: My parsed values

参照は: The reference

しかし、私は私のせいを見つけることができないのです。

+0

これはデータまたはプログラムの問題であるかどうかを判断する独自のテストデータセットを作成しましたか? –

+0

はい、リファレンスは私によって作成されました。バイナリファイルは正しいです。 – gismo

+0

データ型について考えていますか?docuは、浮動小数点は32ビットであり、倍精度は64ビットの値であることを伝えています。 – gismo

答えて

0

私は今朝問題を解決できました。

解決策は簡単ではありませんでした。

私は

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

への変更:

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

お知らせモードとして 'RB' に 'R' からの変更を。

Pythonのドキュメンタリーは、私のために物事が明らかにした:

バイナリファイルを開くときにこのように、あなたは移植性を向上させるであろう、バイナリモードでファイルを開くモード 値に「b」を追加する必要があります。 (「B」を付加することも、それがドキュメントとして機能し、異なるバイナリ扱いと テキストファイルしていないシステム上で有用です。)

だから、最終的に解析された値は次のようになります。

Final values