Введение
1. Рассчитаем CRC16(Modbus) (см. тут On-line CRC calculation
http://www.lammertbies.nl/comm/info/crc-calculation.html) от двух байт 0x01, 0х02. Получаем значение 0xE181.
2. А теперь рассчитаем CRC16(Modbus) от четырех байт 0x01, 0х02, 0x81, 0xE1 (добавили младший и старший от ранее рассчитанного CRC). Получаем значение 0x0000.
ДА именно 0x0000 и байты 0x01, 0х02 можно заменить на любые (при выполнении 1 и 2). Все равно будет 0x0000.
Что это за свойство и неужели все про него знают? Я не знал.
Как называется это свойство и вообще подобные свойства? Есть ли подобные свойства при другом полиноме? А у CRC32?
Итог
История применения CRC16(Modbus)
Был на скорую руку сделан протокол с разделением пакетов по специальному символу. Соответственно был применен байт-стаффинг. В общем, длина пакета определяется по количеству байт до специального символа и далее сразу рассчитывается CRC для проверки пакета. Было выявлено, что при наличии интенсивных помех в канале связи, происходит добавление нулей в принимаемую последовательность и иногда вместо приема 0x01, 0х02, 0x81, 0xE1 получатся прием 0x01, 0х02, 0x81, 0xE1, 0х00 , 0х00.
!!!!!!!!!!!!!!!!!!!!!!!!!!!
А так как мы считаем два последних байта значением CRC, то такой неверный пакет проходит как правильный.
!!!!!!!!!!!!!!!!!!!!!!!!!!!