Параметры распространённых CRC и кодов Хэмминга

Справочная таблица параметров алгоритмов CRC в модели Rocksoft (Width, Poly, Init, RefIn, RefOut, XorOut) с контрольными значениями от строки «123456789», рассчитанными по алгоритму: CRC-5/USB, CRC-7/MMC, CRC-8, CRC-8/MAXIM, CRC-16/MODBUS, CRC-16/CCITT-FALSE, CRC-16/XMODEM, CRC-32, CRC-32C. Запись полиномов, какие ошибки обнаруживает CRC, параметры кодов Хэмминга и расширенных кодов SECDED.

Рекламный блок «после калькулятора» (ads/after-calc.html)

Циклический избыточный код (CRC) — остаток от деления сообщения, записанного как двоичный многочлен, на порождающий многочлен (полином) степени w. Кроме полинома, конкретный вариант CRC задаётся ещё пятью параметрами (модель Rocksoft, по которой описаны почти все CRC):

  • Width — разрядность CRC (степень полинома);
  • Poly — полином без старшего бита, в «прямой» записи;
  • Init — начальное значение регистра;
  • RefIn / RefOut — переворачивать ли биты каждого входного байта и итогового значения (младший бит первым);
  • XorOut — значение, с которым складывается результат по модулю 2;
  • Check — CRC от ASCII-строки «123456789», по которому проверяют правильность реализации.

Распространённые варианты CRC

Контрольные значения в таблице вычислены по алгоритму с указанными параметрами (во всех вариантах RefIn = RefOut). Проверить свои данные можно в калькуляторе CRC, в котором есть все эти варианты.

ВариантБитПолиномInitОтражениеXorOutCRC от «123456789»Где применяется
CRC-5/USB50x050x1Fда0x1F0x19пакеты-маркеры USB
CRC-7/MMC70x090x00нет0x000x75команды SD- и MMC-карт
CRC-8 (SMBus)80x070x00нет0x000xF4SMBus, ATM HEC
CRC-8/MAXIM80x310x00да0x000xA1датчики Dallas 1-Wire (DS18B20)
CRC-16/ARC160x80050x0000да0x00000xBB3Dархиваторы ARC, LHA
CRC-16/MODBUS160x80050xFFFFда0x00000x4B37протокол Modbus RTU
CRC-16/CCITT-FALSE160x10210xFFFFнет0x00000x29B1многие встраиваемые протоколы
CRC-16/XMODEM160x10210x0000нет0x00000x31C3протоколы XMODEM, ZMODEM
CRC-16/KERMIT160x10210x0000да0x00000x2189протокол Kermit, Bluetooth
CRC-16/X-25160x10210xFFFFда0xFFFF0x906EHDLC, X.25, IrDA
CRC-32320x04C11DB70xFFFFFFFFда0xFFFFFFFF0xCBF43926ZIP, gzip, PNG, Ethernet
CRC-32C320x1EDC6F410xFFFFFFFFда0xFFFFFFFF0xE3069283iSCSI, SCTP, Btrfs, ext4
CRC-32/BZIP2320x04C11DB70xFFFFFFFFнет0xFFFFFFFF0xFC891918архиватор bzip2
CRC-32/MPEG-2320x04C11DB70xFFFFFFFFнет0x000000000x0376E6E7цифровое телевидение MPEG-2 TS
Рекламный блок «внутри статьи» (ads/in-article.html)

Как записывают полиномы

Один и тот же полином встречается в разных записях. Например, CRC-16-CCITT x¹⁶ + x¹² + x⁵ + 1:

ЗаписьЗначениеКак получить
Прямая (normal)0x1021биты степеней 15…0, старший x¹⁶ опущен
Обратная (reversed)0x8408те же биты в обратном порядке — для реализаций «младшим битом вперёд»
Купмана (Koopman)0x8810биты степеней 16…1, младший член +1 опущен
Полная0x11021все 17 коэффициентов

Для CRC-32 прямая запись 0x04C11DB7, обратная — 0xEDB88320 (именно эта константа встречается в большинстве табличных реализаций ZIP и Ethernet).

Какие ошибки обнаруживает CRC

  • все одиночные ошибки — если в полиноме больше одного ненулевого члена;
  • все ошибки в нечётном числе бит — если полином делится на (x + 1), как у CRC-16-CCITT и CRC-16/ARC;
  • все пакеты ошибок (подряд идущие искажённые биты) длиной до w включительно;
  • длинные пакеты — с вероятностью пропуска около 2−w (для CRC-32 — одна на 4 миллиарда).

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

Коды Хэмминга

Код Хэмминга с r проверочными битами имеет длину n = 2r − 1 и исправляет любую одиночную ошибку. Добавив общий бит чётности, получают расширенный код (SECDED): он исправляет одну ошибку и обнаруживает две. Такие коды используются в памяти ECC.

Проверочных бит rДлина кода n = 2r − 1Информационных бит kОбозначениеСкорость k/nРасширенный код (SECDED)
231Хэмминг (3, 1)0,333(4, 1)
374Хэмминг (7, 4)0,571(8, 4)
41511Хэмминг (15, 11)0,733(16, 11)
53126Хэмминг (31, 26)0,839(32, 26)
66357Хэмминг (63, 57)0,905(64, 57)
7127120Хэмминг (127, 120)0,945(128, 120)
8255247Хэмминг (255, 247)0,969(256, 247)

Например, в серверной памяти ECC на каждые 64 бита данных добавляется 8 проверочных: укороченный код SECDED (72, 64). Закодировать и декодировать сообщение с внесением ошибки можно в калькуляторе кода Хэмминга, а число различающихся бит между двумя словами — в калькуляторе расстояния Хэмминга.

Рекламный блок «внизу страницы» (ads/bottom.html)