3

次のcコード(ファイルのチェックサムを計算するため)をPythonに変換する必要があります。対応するコードをPythonで作成しましたが、結果がcバージョンと一致しませんでした。問題は、オーバーフローが発生するたびにpythonがintを自動的にlongにプロモートし、これによりチェックサムが間違ってしまうことでした。

この問題を克服する方法はありますか?または、longをsigned int32に変換するPython関数はありますか?

ありがとう

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 に答える