Какой алгоритм CRC-32 используется в классе Java CRC-32? В java-документе нет подробностей. Что такое используемый полином и начальное значение для вычисления?Реализация CRC-32 в java.util.zip.CRC32
ответ
Согласно source:
Вычисляет CRC32 контрольная сумма данных из потока данных. Фактический алгоритм CRC32 описан в RFC 1952 (спецификация формата файла GZIP версия 4.3). Может использоваться для получения CRC32 по потоку, если используется с проверенными потоками ввода/вывода.
RFC1952 можно найти here, но представляет собой довольно техническое чтение.
Начальное значение для CRC: 0xFFFFFFFF
, а таблица CRC построена при первом запуске класса на виртуальной машине.
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
Я генерирую CRC32 с использованием Java-класса, но мне нужно объяснить алгоритм, используемый для получателя, который не использует java. Вернусь ли я, если я дам ему следующие данные? ИСО/МЭК 3309 32-битный алгоритм CRC Используемый полином 0x04C11DB7 Исходное значение будет 0 – Dunxton
currently accepted answer неверен.
Начальное значение для класса CRC32 Java является 0, а не 0xFFFFFFFF, как можно увидеть в исходном коде для функции сброса:
/**
* Resets CRC-32 to initial value.
*/
public void reset() {
crc = 0;
}
Я сделал быстрый поиск перебором , и оказывается, что обновление 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
Используя инструменты из Интернета (http://www.sunshine2k.de/coding/javascript/crc/crc_js.html) Я нашел комбинацию параметров CRC32, что дает те же результаты, получены от Java:
- Вход отражается, результат отражается.
- Полиномиальный: 0x04C11DB7.
- Начальное значение: 0xFFFFFFFF.
- Final XOR: 0xFFFFFFFF
[ссылка] (http://regregex.bbcmicro.net/crc-catalogue.htm) говорит, что значение Init является 0xFFFFFFFF. Я смущен ! – Dunxton
Dunxton, если вы инициализируете новый объект 'CRC32' без содержимого и вызываете' getValue() ', он возвращает' 0 & 0xffffffffL', что равно '0'. Не уверен, что это значит OP? – Marcelo
Я попробовал это [ссылка] (http://www.zorc.breitbandkatze.de/crc.html). Для многочлена 0x04C11DB7 я вводим начальное значение как 0, но результат неверен. Когда я пытаюсь 0XFFFFFFFF, я получаю ожидаемое значение. – Dunxton