Java CRC32: не то же самое, что CRC из C # - PullRequest
2 голосов
/ 03 декабря 2010

Мне нужно сравнить файлы с Java с кодом CRC32, предоставленным скриптом C #. Когда я вычисляю CRC32 с помощью java.util.zip.CRC32, результат совершенно другой ...

Я предполагаю, что polynom = 0x2033 скрипта C # отличается от используемого в zip.CRC32. Можно ли установить полином? Или какие-нибудь идеи java-класса для вычисления CRC32, где вы можете определить свой собственный полином?

ОБНОВЛЕНИЕ: проблема не в полимном. То же самое между 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;
        }
    }
}

Большое спасибо, Frank

Ответы [ 4 ]

3 голосов
/ 03 декабря 2010

Стандартный (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 # вы упомянули ...

Этот фрагмент кода может оказаться полезным:

1 голос
/ 03 декабря 2010

CRC-32 является конкретным вариантом CRC в соответствии с IEEE 802.3 и использует полином 0x04C11DB7. Если ваша библиотека C # использует полином 0x2033, это / не / реализация CRC-32.

Если вам нужен код Java для вычисления произвольных вариантов CRC, поиск в Google "java crc" даст вам несколько примеров.

0 голосов
/ 08 сентября 2014

1 + х + х ^ 2 + х ^ 4 + х ^ 5 + х ^ 7 + х ^ 8 + х ^ 10 + х ^ 11 + х ^ 12 + х ^ 16 + х ^ 22 + х ^ 23+ x ^ 26 (0x04C11DB7) Java использует вышеуказанный полином для вычисления CRC 32 и отличается от стандарта IEEE 802.3, который дополнительно имеет 32-разрядную степень x.

0 голосов
/ 09 декабря 2010

Решено путем копирования кода из C # и преобразования его в Java-класс ...

Так что теперь оба используют один и тот же код, только нужно было внести некоторые незначительные изменения в различие беззнаковых <> байтов со знаком.

...