3

我需要将以下 c 代码(计算文件的校验和)转换为 python。我已经在python中编写了相应的代码,但结果与c版本不匹配。问题是,每当发生溢出时,python 都会自动将 int 提升为 long,这会导致错误的校验和。

知道如何克服这个问题吗?或者是否有一个 python 函数可以将 long 转换为 signed 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 
4

1 回答 1

2

如果您需要限制范围,请使用numpy.int32或。numpy.uint32或者通过1 << 32可能“溢出”的操作对其进行修改。

于 2010-02-20T02:19:45.533 回答