2012-01-25 4 views

ответ

4

Согласно source:

Вычисляет CRC32 контрольная сумма данных из потока данных. Фактический алгоритм CRC32 описан в RFC 1952 (спецификация формата файла GZIP версия 4.3). Может использоваться для получения CRC32 по потоку, если используется с проверенными потоками ввода/вывода.

RFC1952 можно найти here, но представляет собой довольно техническое чтение.

Начальное значение для CRC: 0xFFFFFFFF, а таблица CRC построена при первом запуске класса на виртуальной машине.

+1

[ссылка] (http://regregex.bbcmicro.net/crc-catalogue.htm) говорит, что значение Init является 0xFFFFFFFF. Я смущен ! – Dunxton

+0

Dunxton, если вы инициализируете новый объект 'CRC32' без содержимого и вызываете' getValue() ', он возвращает' 0 & 0xffffffffL', что равно '0'. Не уверен, что это значит OP? – Marcelo

+1

Я попробовал это [ссылка] (http://www.zorc.breitbandkatze.de/crc.html). Для многочлена 0x04C11DB7 я вводим начальное значение как 0, но результат неверен. Когда я пытаюсь 0XFFFFFFFF, я получаю ожидаемое значение. – Dunxton

4

CRC-32 указан в документации на упаковку для java.util.zip, указываемый в RFC 1952. RFC 1952 определяет CRC32, как указано в ISO 3309, который я не мог найти в бесплатной копии, чтобы связать вас. Однако RFC 1952 также указывает, что в разделе 8.1.1.6.2 из ITU-T recommendation V.42 указывается та же реализация.

В partcular многочлен используется в

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 
+0

Я генерирую CRC32 с использованием Java-класса, но мне нужно объяснить алгоритм, используемый для получателя, который не использует java. Вернусь ли я, если я дам ему следующие данные? ИСО/МЭК 3309 32-битный алгоритм CRC Используемый полином 0x04C11DB7 Исходное значение будет 0 – Dunxton

0

currently accepted answer неверен.

Начальное значение для класса CRC32 Java является 0, а не 0xFFFFFFFF, как можно увидеть в исходном коде для функции сброса:

/** 
* Resets CRC-32 to initial value. 
*/ 
public void reset() { 
    crc = 0; 
} 

https://github.com/openjdk-mirror/jdk7u-jdk/blob/master/src/share/classes/java/util/zip/CRC32.java#L81

Я сделал быстрый поиск перебором , и оказывается, что обновление CRC со значением 0xFFFFFFFF фактически даст то же значение. Так что если вы хотите алгоритм CRC32 иметь начальное значение 0XFFFFFFFF, просто сделать:

CRC32 crc = new CRC32(); 
    // Set the initial value to 0xFFFFFFFF 
    crc.update(new byte[]{(byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF}); 

    System.out.println("CRC: " + crc.getValue()); // prints 4294967295, which is 0xFFFFFFFF 
1

Используя инструменты из Интернета (http://www.sunshine2k.de/coding/javascript/crc/crc_js.html) Я нашел комбинацию параметров CRC32, что дает те же результаты, получены от Java:

  • Вход отражается, результат отражается.
  • Полиномиальный: 0x04C11DB7.
  • Начальное значение: 0xFFFFFFFF.
  • Final XOR: 0xFFFFFFFF