Циклический контроль избыточности (CRC) - это код обнаружения ошибок, обычно используемый в цифровых сетях и устройствах хранения для обнаружения случайных изменений необработанных данных.

Циклический контроль избыточности (CRC) - это код обнаружения ошибок, обычно используемый в цифровых сетях и устройствах хранения для обнаружения случайных изменений необработанных данных. К блокам данных, поступающим в эти системы, прикрепляется короткое контрольное значение, основанное на остатке от полиномиального деления их содержимого; при извлечении расчет повторяется, и можно предпринять корректирующие действия против предполагаемого повреждения данных, если контрольные значения не совпадают. википедия

Наиболее часто используемые полиномиальные длины:

  • CRC-8: 9 бит
  • CRC-16: 17 бит
  • CRC-32: 33 бита
  • CRC-64: 65 бит

Поистине превосходным учебником по CRC является "Безболезненное руководство по алгоритмам обнаружения CRC" Росс Уильямс, которое также можно найти здесь, здесь, здесь, здесь и здесь.

Прежде чем задать вопрос о CRC, проверили ли вы сначала:

  • Какой алгоритм CRC обсуждается?
    • Укажите конкретный источник вашей CRC. Если вы спрашиваете об Ethernet CRC-32, так и скажите. Если вы спрашиваете о Castagnoli CRC-32C, так и скажите.
    • В Википедии существует каталог параметров CRC и список полиномов CRC, которые можно использовать для обозначения более экзотических образцов.
    • Убедитесь, что выбрали правильный тег.
  • Полиномиальной: Является ли многочлен правильно?
    • Это бит-реверс?
    • Это байтовый обмен?
    • Это дополняется?
  • Инициализация: правильно ли инициализирована CRC?
    • Некоторые инициализируются нулями, некоторые - единицами, а некоторые - чем-то совершенно другим. Убедитесь, что у вас правильная инициализация.
    • Для ненулевой инициализации имеет значение, будет ли сообщение передано через сдвиговый регистр или просто обработано XOR для его вывода.
  • Обработка:
    • Правильно ли выполняется CRC-проверка данных с перестановкой байтов?
    • Вы движетесь в правильном направлении?
    • Используете ли вы какие-либо встроенные функции CRC, например Intel SSE4.2? crc32 инструкция?
    • Правильна ли ваша таблица поиска для выбранного полинома и порядка байтов?
  • Завершение: правильно ли оформлен CRC?
    • Некоторые схемы CRC требуют, чтобы результат полинома был подвергнут XOR с определенной константой, например 0xFFFFFFFF, а некоторые нет.
    • Вывод CRC может быть инвертирован в вашей реализации.