Problema en el cálculo de la suma de comprobación: convertir int a int32 con signo
Necesito convertir el siguiente código c (para calcular la suma de verificación de un archivo) a python. Había escrito el código correspondiente en python pero el resultado no coincidía con la versión c. El problema fue que python promueve automáticamente int a long siempre que se produce un desbordamiento y esto da como resultado sumas de verificación incorrectas.
¿Alguna idea de cómo superar este problema? ¿O hay una función de Python que convierte largos a int32 con signo?
Gracias
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;
}
Solución:
Gracias por toda la ayuda. Aquí está la función que funcionó para mí:
def int32(x):
x = 0xffffffff & x
if x > 0x7fffffff :
return - ( ~(x - 1) & 0xffffffff )
else : return x