Контроль циклическим избыточным кодом (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 мог бы быть инвертирован битом в Вашей реализации.