При вычислении CRC суммы обычно используется lookup таблица, чтобы ускорить вычисление.
Я задумал вычислять эту таблицу (а не задавать на этапе написания кода в виде констант).
Нашел такую ссылку:
http://www.piclist.ru/S-CRC16-RUS/CRC16.html
Где описана функция для заполнения lookup таблицы.
Заимплементил эту фунцкию.
Однако.
Согласно
данным из википедии
В секции "Пример программы табличного (быстрого) расчёта CRC-16 CCITT на языке Си " для полинома
Poly : 0x1021 x^16 + x^12 + x^5 + 1
таблица получается такая:
const unsigned short Crc16Table[256] = {
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
Я привожу начало таблицы, она именно такая у меня и вычисляется.
А вот в секции "Пример программы табличного (быстрого) расчёта стандартного (ARC) CRC-16 на языке Си" для полинома:
Poly : 0x8005 x^16 + x^15 + x^2 + 1
таблица должна быть:
const unsigned short Crc16Table[256] = {
0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,
У меня же начало таблицы выглядит так
0x0000, 0x8005, 0x800F ....
Причем, в силу особенностей приведенной функции для вычисления таблицы, второй элемент в таблице всегда должен быть равен полиному (в данном случае 0x8005), потому я в принципе не понимаю, почему же в примере из википелии второй элемент таблицы равен 0xC0C1. CRC, выполненное по моей таблице, не принимается устройством, а вычисленное по таблице из википедии — принимается.
При всем при этом для полинома 0x1021 таблица вычисляется правильно.
Правда, для полинома 8005 в википедии написано "Revert: true", но куда мне это приткнуть, я не понимаю...
Собственно вопрос — как же вычислить lookup таблицу для быстрого вычисления CRC16 с полиномом 8005?