2016-08-08 4 views
-1

にlongにバイトを変換し、私のC++コードです:私はpythonでまさにこの作品のコードを複製しようとしていますし、これまでの私のコードがあるは、ここでのpython

int r; // result of log_2(v) goes here 
    union { unsigned int u[2]; double d; } t; // temp 

    t.u[__FLOAT_WORD_ORDER==LITTLE_ENDIAN] = 0x43300000; 
    t.u[__FLOAT_WORD_ORDER!=LITTLE_ENDIAN] = v; 
    t.d -= 4503599627370496.0; 
    r = (t.u[__FLOAT_WORD_ORDER==LITTLE_ENDIAN] >> 20) - 0x3FF; 
    return r; 

class s(Structure): 
    _fields_ = [("u", c_ulonglong), ("d", c_double)] 
    t = s() 
    t.u = pack('<Q', c_ulonglong(int("0x43300000", 16))) # Error cannot convert argument to integer 
    t.u = pack('>Q', c_ulonglong(v)) 
    t.d -= 4503599627370496.0 
    r = (t.u >> 20) - 0x3FF 

私は取得していますC++コードでは16進数を "u"にパックする際にエラーが発生します。私はこのエラーを解決し、pythonでこのコードを正常に完了したいと思います。

+0

あなたのC++コードはそもそも法的ではありません。最後に割り当てられたメンバー以外の 'union'メンバーを読み取ることはできません。 –

+3

このCコードのどこにC++がありますか? –

+0

@BaummitAugen私は構造体に組合を変更しますが、それでも私の問題は解決しません。 –

答えて

0

これは完全な例(ここでは未定義の値がたくさんあります)を助けますが、これは意図に近いものです。 Unionc_int * 2の使用に注意してください:

class s(Union): 
    _fields_ = [("u", c_int * 2), 
       ("d", c_double)] 

t = s() 
t.u[__FLOAT_WORD_ORDER==LITTLE_ENDIAN] = 0x43300000 
t.u[__FLOAT_WORD_ORDER!=LITTLE_ENDIAN] = v # whatever that is 
t.d -= 4503599627370496.0 
r = (t.u[__FLOAT_WORD_ORDER==LITTLE_ENDIAN] >> 20) - 0x3FF 
return r