Какой вкус у CRC-CCITT? - PullRequest
       13

Какой вкус у CRC-CCITT?

0 голосов
/ 28 октября 2018

Может кто-нибудь сказать, какой вариант CRC-CCITT реализован в этом коде ?

Когда я использую его для вычисления CRC над "123456789", я получаю 0x6E90.Но он не соответствует ни одному из CRC здесь: https://www.lammertbies.nl/comm/info/crc-calculation.html

Но он действительно обладает свойством CRC, когда включение CRC в данные, которые являются CRC, приводит к известному постоянному значению.

1 Ответ

0 голосов
/ 29 октября 2018

Код показывает CRC16 со смещением вправо на основе 0x11021, который при обращении бита и смещении вправо на 1 бит становится 0x8408.Это разновидность CRC-CCITT (Kermit), но в отличие от Kermit, он начинается с CRC = 0xFFFF (Kermit начинается с CRC = 0x0000) и дополняет CRC в конце, поэтому он не будет соответствовать ни одному из CRC.показанный на веб-сайте Lammertbies.Вы можете проверить, что это похоже на Kermit, перейдя на веб-сайт lammertbies, переключившись в шестнадцатеричный режим и введя один байт 80, что приведет к 0x0884, что является заменой байта 0x8408 из-за младшего байта.

Если это не было дополнением в конце, то добавление CRC к данным и пересчет CRC для data + CRC вернули бы CRC 0x0000 для любого из обычных методов CRC.С пост-дополнением вы получаете константу, в зависимости от того, какая реализация CRC используется, в данном случае 0x470F (байт снова поменялся местами из-за байтового порядка).

Чтобы проверить это, перейдите на веб-сайт lammertbies, префиксстрока с шестнадцатеричным 21 F3, в результате чего CRC Kermit будет равен 0xFFFF после обработки 21 F3.Переключитесь на шестнадцатеричный ввод и введите строку:

21F3313233343536373839

, в результате CRC Kermit вернет

0x916F

, что при дополнении будет

0x6e90

Youможет изменить пример кода доктора Добба, чтобы он соответствовал Kermit с этими изменениями:

    crc = 0;     /* instead of crc = 0xffff; */
    /* ... */
    /* crc = ~crc;  comment out this line    */
...