Реализация CRC-32 в java.util.zip.CRC32 - PullRequest
4 голосов
/ 25 января 2012

Какой алгоритм CRC-32 используется в классе Java CRC-32?Документ Java не дает никаких подробностей.Какая используется полиномейл и начальное значение для расчета?

Ответы [ 4 ]

5 голосов
/ 25 января 2012

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

В паркулярном полином используется

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
4 голосов
/ 25 января 2012

По данным источника :

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

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

Начальное значение для CRC - 0xFFFFFFFF, и таблица CRC создается при первой загрузке класса на ВМ.

1 голос
/ 19 июля 2017

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

  • Отраженный ввод, отраженный результат.
  • Полином: 0x04C11DB7.
  • Начальное значение: 0xFFFFFFFF.
  • Окончательный XOR: 0xFFFFFFFF
0 голосов
/ 26 апреля 2017

В настоящее время принятый ответ неверен.

Начальное значение для класса 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
...