计算校验和时出现问题:将int强制转换为有符号int32

3

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

C代码中似乎有什么缺失?data/p的使用方式非常奇怪... - mjv
抱歉,在格式化过程中不小心删除了“+”号。已进行更正,谢谢。 - Code freak
1个回答

2

如果需要限制范围,请使用numpy.int32numpy.uint32。在可能“溢出”的操作之后,可以通过模运算1 << 32来处理。


或者 & 0xFFFFFFFF (& ((1<<32)-1)). 我偏好这种写法,但它与 % (1 << 32) 的效果完全相同。 - ephemient
这不仅仅是提取低32位,还需要考虑符号 - Java处理溢出的方式。例如,int i = 0xffffffff; system.out.println(i) 将会输出-1。 - Code freak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接