2011-06-28 6 views
4

私はこのバイナリファイルにパックされたいくつかのデータを解析しようとしており、Pythonの構造体モジュールは私にあらゆる種類の問題を引き起こしています。デフォルトでは、他のタイプのフロートを開梱して、期待した結果を得ることができないのはなぜですか?

import struct 

# a fragment of the binary file 
a = '\x39\x00\xFF\x00\x00\x0A\x00\x1F\x05\xDC\x42\x31\x30\x00\xFF\x00\x00\x0A\x00\xB5\x01\xE6\x42' 

struct.unpack_from('1sxHxbxf', a) 
# returns ('9', 255, 10, 2.8355782166755716e-09), but 
struct.unpack_from('f',a[7:]) 
# gives the expected (110.01000213623047,) 

答えて

8

、Cタイプは、マシンのネイティブフォーマットとバイト順で表現されています。私に一度に複数のタイプをやろうとしています正しい浮動小数点変数を与えるように見えません。必要に応じて(Cコンパイラで使用される規則に従って)パッドバイトをスキップすることによって適切に整列されます。

アンパックでは、浮動小数点数が8バイトの境界に揃うことが予想され、そこに到達するために1つのパディングバイトをスキップします。あなたは自分でバイト1をスキップして、これを確認することができます。

>>> struct.unpack_from('1sxHxbxf', a) 
('9', 255, 10, 2.8355782166755716e-09) 
>>> struct.unpack_from('f',a[8:]) 
(2.8355782166755716e-09,) 

合わせ、add =, <, >, or ! to the front of the format stringを無効にします。

>>> struct.unpack_from('=1sxHxbxf', a) 
('9', 255, 10, 110.01000213623047) 
関連する問題