Проблема в вычислении контрольной суммы: приведение int к подписанному int32
Мне нужно преобразовать следующий код c (чтобы вычислить контрольную сумму для файла) в Python. Я написал соответствующий код на python, но результат не соответствовал версии c. Проблема заключалась в том, что python автоматически переводит int в long при возникновении переполнения, что приводит к неправильным контрольным суммам.
Есть идеи, как преодолеть эту проблему? или есть функция python, которая конвертирует long в int32 со знаком?
Спасибо
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;
}
Решение:
Спасибо за помощь. Вот функция, которая работала для меня -
def int32(x):
x = 0xffffffff & x
if x > 0x7fffffff :
return - ( ~(x - 1) & 0xffffffff )
else : return x