CRC — циклический избыточный код
CRC — короткое контрольное значение, которое передатчик вычисляет по блоку данных и добавляет к нему, а приёмник пересчитывает и сравнивает. Так обнаруживают ошибки в кадрах Modbus, 1-Wire, CAN, Ethernet и в файлах ZIP и PNG.
Обновлено Редакция GAW
CRC (cyclic redundancy check, циклический избыточный код) — контрольное значение, которое вычисляется как остаток от деления сообщения на заранее выбранный многочлен (полином) в арифметике по модулю 2, где сложение и вычитание заменяются операцией «исключающее ИЛИ». Передатчик добавляет остаток к данным, приёмник пересчитывает его и сравнивает: если хотя бы один бит по пути исказился, остаток почти наверняка не совпадёт. CRC обнаруживает ошибки, но не исправляет их.
Параметры алгоритма
По модели Росса Уильямса любой CRC описывается шестью параметрами: разрядностью (Width), полиномом (Poly), начальным значением регистра (Init), отражением битов входных байтов (RefIn) и результата (RefOut) и значением финального XOR (XorOut). Для проверки реализации используют контрольное значение — CRC строки «123456789».
| Алгоритм | Полином | Init | Отражение | XorOut | CRC строки «123456789» |
|---|---|---|---|---|---|
| CRC-8/MAXIM-DOW (1-Wire) | 31 | 00 | да | 00 | A1 |
| CRC-16/MODBUS | 8005 | FFFF | да | 0000 | 4B37 |
| CRC-32/ISO-HDLC (ZIP, Ethernet) | 04C11DB7 | FFFFFFFF | да | FFFFFFFF | CBF43926 |
| CRC-32/MPEG-2 (блок CRC STM32) | 04C11DB7 | FFFFFFFF | нет | 00000000 | 0376E6E7 |
Параметры и контрольные значения — по каталогу RevEng. Полином в таблице записан в прямом виде; в программах с отражёнными битами встречается его зеркальная запись — у Modbus это A001 вместо 8005.
Где встречается
CRC-16 замыкает каждый кадр Modbus RTU, а 8-битный CRC защищает ROM-код и данные датчиков 1-Wire, например DS18B20. Посчитать CRC по байтам или тексту, подобрать параметры под своё устройство и получить функцию на C можно в калькуляторе CRC; собрать кадр Modbus вместе с CRC поможет конструктор кадра Modbus RTU.
Частые вопросы
Почему разные калькуляторы дают для одних данных разный CRC?
Потому что «CRC-16» — не один алгоритм, а семейство. Кроме разрядности и полинома результат зависит от начального значения, отражения битов входа и результата и финального XOR. Только 16-битных вариантов в каталоге RevEng больше тридцати. Чтобы совпасть с устройством, нужно знать все шесть параметров и проверить их по контрольному значению для строки «123456789».
Чем CRC лучше простой суммы байтов?
Сумма байтов не меняется, если байты переставить местами, и не замечает многие сочетания ошибок, которые взаимно компенсируются. CRC зависит от порядка и положения каждого бита: это остаток от деления всего сообщения на полином, и изменение любого бита меняет остаток по-своему. Поэтому CRC обнаруживает гораздо больше типичных ошибок линии связи.
В каком порядке передаются байты CRC?
Это задаёт протокол. В Modbus RTU 16-битный CRC передают младшим байтом вперёд — так требует спецификация MODBUS over Serial Line. В других протоколах бывает наоборот, поэтому порядок байтов проверяют по документации или по примеру кадра из неё.
Источники
- Ross N. Williams. A Painless Guide to CRC Error Detection Algorithms. 1993 — CRC как остаток от деления многочленов по модулю 2; модель параметров Width, Poly, Init, RefIn, RefOut, XorOut
- Greg Cook. Catalogue of parametrised CRC algorithms (CRC RevEng) — параметры и контрольные значения CRC-8/MAXIM-DOW, CRC-16/MODBUS, CRC-32/ISO-HDLC, CRC-32/MPEG-2
- Modbus Organization. MODBUS over Serial Line: Specification and Implementation Guide V1.02 — CRC в режиме RTU: начальное значение FFFF, полином A001, младший байт первым
Нашли ошибку?