计算校验和时的问题:将 int 转换为有符号 int32

3 投票
1 回答
1863 浏览
提问于 2025-04-15 19:30

我需要把下面这段C语言代码(用于计算文件的校验和)转换成Python。我写了对应的Python代码,但结果和C语言的版本不一样。问题在于,Python在发生溢出时会自动把整数提升为长整型,这导致了校验和计算错误。

有没有什么办法可以解决这个问题?或者有没有Python函数可以把长整型转换为带符号的32位整数?

谢谢

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 个回答

2

如果你需要限制数字的范围,可以使用 numpy.int32 或者 numpy.uint32。另外,在进行可能会导致“溢出”的操作后,可以用 1 << 32 来进行取模运算。

撰写回答