bitlvl
RU

Калькулятор CRC и контрольных сумм

Введите текст, вставьте hex-байты или перетащите файл и получите все распространённые CRC сразу, каждый со своими параметрами, чтобы найти вариант, который использует устройство или протокол.

Или перетащите файл, или

Собственная модель CRC

Отражение

Результаты и сообщения этого инструмента выводятся на английском языке.

Что такое CRC

Циклический избыточный код рассматривает сообщение как одно длинное двоичное число и делит его на фиксированный полином; остаток и есть контрольная сумма. Инвертируйте любой один бит или любую серию битов короче CRC — и остаток изменится, поэтому CRC защищают кадры Ethernet, записи ZIP, чанки PNG, секторы дисков и последовательные протоколы. Они быстры и в аппаратной, и в программной реализации, но не являются криптографическими: кто угодно может подобрать данные с нужным CRC.

Почему существует столько «CRC-16»

Две реализации одной разрядности могут различаться пятью параметрами, и каждая комбинация — это другая контрольная сумма:

ПараметрЗначение
ПолиномДелитель, записанный без старшего бита (0x1021 для CCITT, 0x04C11DB7 для CRC-32).
InitНачальное значение регистра, 0 или все единицы.
Отражение входаОбрабатывается ли каждый входной байт начиная с младшего бита (да для CRC-32, MODBUS; нет для CCITT-FALSE, XMODEM).
Отражение выходаПереворачивается ли итоговый регистр побитно.
XOR outЗавершающий XOR, обычно 0 или все единицы.

Стандартный способ опознать вариант — его контрольное значение: CRC строки ASCII 123456789. Таблица выше показывает его для каждой модели, а ввод по умолчанию — именно эта строка, так что если устройство выдаёт контрольную сумму для известных данных, вы можете сравнить её со всеми вариантами сразу.

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

  • CRC-32 (0x04C11DB7, отражённый): Ethernet, ZIP, gzip, PNG, zlib.crc32, cksum -o 3.
  • CRC-32C (Castagnoli): iSCSI, SCTP, метаданные ext4, Btrfs, LevelDB; имеет аппаратную инструкцию на x86 и ARM, поэтому это быстрый выбор для новых разработок.
  • CRC-16/MODBUS: Modbus RTU по последовательному порту; CRC-16/CCITT-FALSE: Bluetooth, многое из того, что называют «CRC-CCITT»; CRC-16/XMODEM: XMODEM, binascii.crc_hqx в Python.
  • Adler-32: потоки zlib; быстрее CRC, но слабее на коротких входных данных.

Вопросы

CRC — это то же самое, что хеш?

Нет. CRC обнаруживает случайное повреждение и тривиально обращается или подделывается. Для целостности при наличии злоумышленника или для идентификации файлов используйте SHA-256. Для скорости на доверенном канале CRC подходит.

Моё устройство выдаёт другой CRC-16, чем эта страница.

Существует не меньше десятка вариантов CRC-16. Введите данные, для которых устройство посчитало контрольную сумму, и сравните его значение с каждой строкой таблицы; совпавшая строка покажет полином, init и отражение, которые использует устройство. Если ничего не совпало, попробуйте собственную модель и проверьте, не включает ли устройство в данные байт длины или адрес.

Какой порядок байтов у результата?

CRC показан как число. Когда он записывается в пакет, порядок определяет протокол: MODBUS передаёт сначала младший байт, XMODEM — старший. Сверьтесь со спецификацией или примером кадра.

Что такое CRC-32C и почему его используют базы данных?

Это CRC-32 с полиномом Кастаньоли, который лучше обнаруживает ошибки при размерах блоков, характерных для систем хранения, и реализован одной инструкцией CPU (SSE4.2 crc32, ARMv8 CRC32C), что делает его в несколько раз быстрее классического CRC-32.

Можно ли вычислять CRC инкрементально?

Да. Все эти CRC можно продолжать с предыдущего значения — именно так работает zlib.crc32(data, previous). Эта страница вычисляет весь ввод за один раз.