私の問題は、この実装を使用するときです。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);