2012-05-01 1 views
3

私は(Pythonの2.7)を使用してfloat型に進値を変換するには、以下の方法しようとしています:以下のように出力されている"アンパックで浮動小数点数をアンパックするとき、" Unpackには長さ4の文字列引数が必要ですか? "

def hex2float(x): 
    y = 0 
    z = x.decode('hex') 
    try: 
     y = struct.unpack('!f', z)[0] 
    except: 
     print sys.exc_info()[1]  
    print 'z = ' + z 
    print 'y = %s' % (y) 
    print 'x = ' + x 
    return 

def foo28(): 
    x = '615885' #8.9398e-039 
    hex2float(x) 

を:

unpack requires a string argument of length 4 
z = aXà 
y = 0 
x = 615885 

私は本当にのための例外メッセージを取得することに注意してください小さい値。そのような場合に、16進値を浮動小数値に変換する適切な方法はありますか?

+1

はい、浮動小数点数を表す32ビット(32ビット浮動小数点数)を得るには4バイトが必要なので、そうです。私が知っているIEEE-754にこの数字を「埋め込む」のは簡単な方法ではありません。おそらくソースが壊れていますか? –

答えて

8

あなたは解凍し、その必要な場合はnullバイトを付加するために4つのバイトを必要とする:あなたが唯一のそれは小さな値のために起こる参照理由ですので

z = x.decode('hex') 
z = '\0' * (4 - len(z)) + z 

通常str.decodeは、値を表現するために、必要に応じてできるだけ多くのバイトを出力。

これは完璧に動作します:

>>> z = '615885'.decode("hex") 
>>> z = '\0' * (4 - len(z)) + z 
>>> struct.unpack('!f', z) 
(8.939797951825212e-39,) 

あなただけ84を変更するだけでなく、この解決策はまだ動作ダブルスやろうとしている場合。

+0

さて、それは今や理にかなっています。 –

+0

ありがとう@ nightcracker。 – gudge

関連する問題