0

私の問題は、この実装を使用するときです。Java CRC32 計算は、ルックアップ テーブルを使用する C# の CRC32 計算とは異なります。

以下は、私が使用しているCRC32コードです。

public static int CalculateCRCWithTable(byte[] data){
    int crc = 0;
    for (byte b : data) {
        crc = CRCTable[(crc & 0xff) ^ (b & 0xff)] ^ (crc >>> 8) ;
    }
    //crc = crc ^ 0xffffffff; // flip bit/sign
    return (crc);       
}

ファイルからの読み取り:

public static byte[] readFromFileToByteArray(String fileName) throws IOException {
    BufferedInputStream fis = new BufferedInputStream(new FileInputStream(fileName));
    byte [] bytes = IOUtils.toByteArray(fis);
    for (byte b : bytes){
        b = (byte) (b & 0xff);          
    }
    return bytes;       
}

単純なテキスト ファイルを使用して Java CRC32 計算をテストすると、CRC 計算は (場合によっては) C# と同じように正しくなりますが、実行可能ファイル/バイナリ ファイルを指定すると、異なる結果が表示されるようになります。

(サンプルデータをコメントから質問セクションに移動): 文字列: 「単純な CRC32 計算テスト」 16 進値:

73 69 6D 70 6C 65 20 43 52 43 33 32 20 63 61 6C 63 75 6C 61 74 69 6F 6E 20 74 65 73 74 

どちらもルックアップ テーブルで実装されています。

  • 「期待/正しい」C# の CRC32 計算: 3347067236
  • Java CRC32 計算: -947900060

同様のスレッドで、Java に unsigned integer 32 を実装すると、違いを修正する必要があると誰かが言及しました。

任意のポインタをいただければ幸いです。ありがとうございます。

解決済み: 確認していただきありがとうございます。それを念頭に置いて、適切なCRC32計算を取得するために以下が必要でした:

String tmp = Integer.toHexString(crc);      
long lCRC = Long.parseLong(tmp, 16);
4

1 に答える 1

1

コメントで提供した 2 つの値 (質問に移動する必要があります) は、下位 32 ビットでまったく同じです。3347067236 = 2 32 - 947900060。どちらも 0xc7803164 です。問題ありません。

于 2013-01-07T18:47:09.513 に答える