2010-02-20 32 views
3

我需要将以下c代码(用于计算文件的校验和)转换为python。我写了,在python中的相应代码,但结果与c版本不匹配。问题是python在发生溢出时自动将int提升为long,并导致错误的校验和。计算校验和的问题:将int转换为带符号的int32

任何想法如何克服这个问题?或者是否有一个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 
+0

c代码中没有缺少的东西吗? data/p似乎以非常奇怪的方式使用... – mjv 2010-02-20 02:11:31

+0

对不起,在格式化过程中意外删除了'+'。更正。谢谢 – 2010-02-20 02:20:53

回答

2

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

+0

或'0xFFFFFFFF'('&((1 << 32)-1)')。我碰巧喜欢那样,但它与'%(1 << 32)'完全相同。 – ephemient 2010-02-20 03:17:14

+0

它不仅仅是提取低32位,而且还需要考虑符号 - java处理溢出的方式。 例如int i = 0xffffffff; system.out.println(i)会给-1。 – 2010-02-20 04:14:03