2016-05-07 16 views
2

私はPython言語の初心者です.C++やJavaで非常に簡単に行うことができますが、何らかの理由で畳み込まれているようですPythonでやること。私は次の4バイトの配列をビッグエンディアンの順序で持っています:Pythonを使用して4バイトを32ビット浮動小数点として解釈する方法

[0x64, 0xD8, 0x6E, 0x3F] 

私はすでにこれらのバイトが何を表しているかは既に知っています。 0.932989

これらの4バイトをその浮動小数点として解釈し、その数を格納するために、Pythonを使用して実行する必要がある手順(追加のインポートを使用しないことが望ましいバージョンv3.2.1)私は32ビット浮動小数点値として扱うことができる変数に?私。

x = [0x64, 0xd8, 0x6e, 0x3f] 
y = int.from_bytes(x, byteorder='little', signed=False) #interpret bytes as an unsigned little-endian integer (so far so good) 
z = float(y) #attempt to cast as float reinterprets integer value rather than its byte values 

y1064228964であるそれらのバイトの右側の期待整数解釈を、持っているにそれをキャストする場合、問題が来る:私は、私が試しただけで、次の変数myVar = 0.932989

として使用することができます32ビットfloatyの生のバイトをfloatとしてキャストするのではなく、それらのバイトの整数表現をキャストするので、0.932989の代わりにには1064228964.0が含まれます。この単純なタスクを実行するために使用できるint.from_bytesに相当するものがありますか?おそらくfloat.from_bytesのようなものでしょうか?

+0

'struct'モジュールを見てください。 – roadrunner66

答えて

4

詳細はPython Structを参照してください。

import struct 

# if input is string, per @robyschek will fail on python 3 
data=b'\x64\xd8\x64\x3f' 
print struct.unpack('<f', data) #little endian 
print struct.unpack('>f', data) # big endian 

#your input 
list1=[0x64, 0xD8, 0x6E, 0x3F] 
# aa=str(bytearray(list1)) # edit: this conversion wasn't needed 
aa= bytearray(list1) 
print struct.unpack('<f', aa) 
​ 

が出力:あなたの具体的な質問については

(0.8939268589019775,) 
(3.193376169798871e+22,) 
(0.9329893589019775,) 
+1

'unpack'はbytearraysに作用するので、' str'にキャストする必要はなく、さらにpy3' unpack'では 'str'を受け入れず失敗します – robyschek

+0

@robyschek:Ty、文字列答えを与えたい一般。 py3上のポインタのためのTy。 – roadrunner66

+0

何らかの理由で、私は 'aa =" bytearray(b'd \\ xd8n? ') "'を取得します。これを修正する方法はありますか? – programmar

1

あなたが効率的に数字の(大)の配列を処理するために本当にだ大きなライブラリを使用して喜んでいる場合:

import numpy as np 
data_bytes = np.array([0x64, 0xD8, 0x6E, 0x3F], dtype=np.uint8) 
data_as_float = data_bytes.view(dtype=np.float32) 
print(data_as_float) 

これは大きなバイト配列でも機能します。浮動小数点数の配列を取得します。

関連する問題