Контроль циклическим избыточным кодом (CRC) является кодом с обнаружением ошибок, наиболее часто используемым в цифровых сетях и устройствах хранения для обнаружения случайных изменений в необработанных данных.
Контроль циклическим избыточным кодом (CRC) является кодом с обнаружением ошибок, наиболее часто используемым в цифровых сетях и устройствах хранения для обнаружения случайных изменений в необработанных данных. Блоки данных, вводящие эти системы, присоединили короткое контрольное число, на основе остатка от полиномиального подразделения их содержания; на извлечении повторяется вычисление, и меры по ликвидации последствий могут быть приняты против предполагаемого повреждения данных, если контрольные числа не соответствуют. Википедия
Обычно используемые полиномиальные длины:
- CRC-8: 9 битов
- CRC-16: 17 битов
- CRC-32: 33 бита
- CRC-64: 65 битов
Действительно превосходное учебное руководство на CRC является “Безболезненным Руководством Ross Williams по Алгоритмам обнаружения CRC”, которые могут также быть найдены здесь, здесь, здесь, здесь, и здесь.
Прежде чем Вы зададите вопрос о CRC, будете иметь Вас сначала проверенный:
- Какой алгоритм CRC обсуждается?
- Будьте конкретны относительно источника своего CRC. Если Вы спрашиваете о Ethernet CRC-32, говорите так. Если Вы спрашиваете о CRC-32C Castagnoli, говорите так.
- Там существует каталог параметров CRC и список многочленов CRC на Википедию, оба из которых могут использоваться для именования более экзотических экземпляров.
- Удостоверьтесь, что выбрали корректный тег.
- Многочлен: многочлен корректен?
- Это инвертируется битом?
- Это подкачивается байтом?
- Это дополнено?
- Инициализация: CRC правильно инициализируется?
- Некоторые инициализируются со все-нулями, некоторыми со все-и некоторыми с чем-то совершенно различным. Обязательно имейте корректную инициализацию.
- Для ненулевой инициализации это имеет значение, передается ли сообщение через сдвиговый регистр или просто XORed к его выводу.
- Обработка:
- Данные являются CRCed, правильно подкачанным байтом?
- Вы переключаете правильное направление на нижний регистр?
- Вы используете какой-либо CRC intrinsics, как SSE4.2 Intel
crc32
инструкция? - Ваша справочная таблица корректна для многочлена и порядка байтов, который Вы выбрали?
- Завершение: CRC правильно завершен?
- Некоторые схемы CRC призывают, чтобы полиномиальным результатом был XORed с конкретной константой, как
0xFFFFFFFF
, в то время как некоторые не делают. - Вывод CRC мог бы быть инвертирован битом в Вашей реализации.