2

C#スクリプトによって提供されるCRC32コードを使用してJavaのファイルを比較する必要があります。java.util.zip.CRC32を使用してCRC32を計算すると、結果は完全に異なります...

私の推測では、C#スクリプトの多項式= 0x2033は、zip.CRC32で使用されているものと同じではありません。多項式を設定することは可能ですか?または、独自の多項式を定義できるCRC32を計算するためのJavaクラスのアイデアはありますか?

更新:問題は多項式ではありません。これはC#とJavaの間で同じです

これは私のコードです、多分私がファイルを読む方法に何か問題がありますか?

package com.mine.digits.internal.contentupdater;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.CRC32;

public class CRC 
{
    public static String doConvert32(File file)
    {
        byte[] bytes = readBytesFromFile(file); // readFromFile(file).getBytes();

        CRC32 x = new CRC32();
        x.update(bytes);

        return (Long.toHexString(x.getValue())).toUpperCase();
    }

    /** Read the contents of the given file. */
    private static byte[] readBytesFromFile(File file)
    {
        try
        {
            InputStream is = new FileInputStream(file);

            long length = file.length(); 
            if (length > Integer.MAX_VALUE) { 
                // File is too large 
            } 

            byte[] bytes = new byte[(int)length]; 
            int offset = 0; 
            int numRead = 0; 
            while (offset < bytes.length && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0)
            { 
                offset += numRead; 
            } 

            // Ensure all the bytes have been read in 
            if (offset < bytes.length) { 
                System.out.println("Could not completely read file " + file.getName()); 
            } 

            // Close the input stream and return bytes 
            is.close(); 

            return bytes;
        }
        catch (IOException e)
        {
            System.out.println("IOException " + file.getName()); 

            return null;
        }
    }
}

どうもありがとう、フランク

4

4 に答える 4

3

標準(IEEE)CRC32多項式は0x04C11DB7であり、これは以下に対応します。

x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 +
x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1

これは、java.util.zip.CRC32が使用するものです。あなたが言及しているC#スクリプトについて知らない...

このコードスニペットは便利です。

于 2010-12-03T10:20:15.030 に答える
1

CRC-32は、IEEE 802.3に準拠した特定のCRCバリアントであり、多項式0x04C11DB7を使用しています。C#ライブラリが多項式0x2033を使用している場合、それはCRC-32の実装ではありません。

任意のCRCバリアントを計算するためにJavaコードが必要な場合は、「javacrc」をグーグルで検索するといくつかの例が表示されます。

于 2010-12-03T10:28:07.707 に答える
0

C#からコードをコピーし、Javaクラスに変換することで解決しました...

そのため、両方とも同じコードを使用し、符号なし<>符号付きバイトの違いに対していくつかの小さな変更を加えるだけで済みました。

于 2010-12-09T09:53:54.590 に答える
0

1 + x + x ^ 2 + x ^ 4 + x ^ 5 + x ^ 7 + x ^ 8 + x ^ 10 + x ^ 11 + x ^ 12 + x ^ 16 + x ^ 22 + x ^ 23 + x ^ 26(0x04C11DB7)Javaは、CRC 32の計算に上記の多項式を使用し、さらにxの32ビットパワーを持つIEEE802.3標準とは異なります。

于 2014-09-08T05:02:53.920 に答える