计算校验和时出现问题:将int转换为signed int32

时间:2010-02-20 02:03:33

标签: python casting checksum

我需要将以下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 

1 个答案:

答案 0 :(得分:2)

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