2016-08-08 2 views
-1

Voici mon code C++:Convertir octets de long en 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; 

Je suis en train de reproduire ce code morceau exactement en python et jusqu'à présent mon code est:

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 

Je reçois une erreur lors de l'emballage du nombre hexadécimal en "u" de la façon dont il est mentionné dans le code C++. Je voudrais résoudre cette erreur et compléter avec succès ce code en python.

+0

Votre code C++ est pas légal pour commencer. Vous ne pouvez pas lire un membre 'union' autre que celui assigné en dernier lieu. –

+3

Où est le C++ dans ce code C? –

+0

@BaummitAugen Ok, je vais changer l'union en une structure, mais cela ne résout pas encore mon problème. –

Répondre

0

Il est utile d'avoir un exemple complet (beaucoup de valeurs non définies ici), mais cela est plus proche de l'intention. Notez l'utilisation de Union et c_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