Код показывает 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 */