2010-02-20 10 views
3

Je dois convertir le code c suivant (pour calculer la somme de contrôle pour un fichier) en python. J'avais écrit, le code correspondant en python mais le résultat ne correspondait pas à la version c. Le problème était que python promouvait automatiquement int à long chaque fois qu'un débordement se produisait, ce qui se traduisait par de mauvais checksums.Problème dans le calcul de la somme de contrôle: int inté à int32

Une idée de comment résoudre ce problème? ou existe-t-il une fonction python qui convertit long à signé int32?

Merci

int calcChecksum(const guchar *data, gsize len) 
{ 

    const guchar *p = data; 
    int checksum = 0, g, i = len; 

    while(i--) { 
      checksum = (checksum << 4) + *p++; 

      if((g = (checksum & 0xf0000000)) != 0) 
        checksum ^= g >> 23; 

      checksum &= ~g; 
    } 
    return checksum; 
} 

Solution:

Merci pour toute l'aide. Voici la fonction qui a fonctionné pour moi -

def int32(x): 
    x = 0xffffffff & x 
    if x > 0x7fffffff : 
     return - (~(x - 1) & 0xffffffff) 
    else : return x 
+0

N'y at-il pas quelque chose qui manque dans le code c? data/p semble être utilisé de façon très étrange ... – mjv

+0

Désolé, le '+' a été accidentellement supprimé lors du formatage. Corrections faites. merci –

Répondre

2

Utilisez numpy.int32 ou numpy.uint32 si vous avez besoin de limiter la portée. Ou modifiez-le par 1 << 32 après des opérations qui pourraient "déborder".

+0

Ou '& 0xFFFFFFFF' (' & ((1 << 32) -1) '). Il m'arrive d'aimer ça plus, mais ça fait exactement la même chose que '% (1 << 32)'. – ephemient

+0

Il ne s'agit pas seulement d'extraire les 32 bits inférieurs, mais le signe doit également être pris en compte - la manière dont java gère le débordement. par exemple. int i = 0xffffffff; system.out.println (i) donnerait -1. –