CRC-16, вычисление lookup таблицы для полинома 8005
От: dlk Россия  
Дата: 25.06.09 11:32
Оценка:
При вычислении 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?
crc lookup 8005
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.