подсчёт CRC16 для любого полинома

Тема в разделе "LANGS.C", создана пользователем hawk, 19 июн 2011.

  1. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    Здравствуйте.
    Подскажит кто знает,
    правильно ли я сделал алгоритм подсчёта CRC16.
    Алгоритм предполагает универсальность-т.е.полином может быть абсолютно любым.
    Код (Text):
    1. INT16 CRC_16_table[256];
    2.  
    3.  
    4. void CRC_16_create_table(INT16 Polinom)
    5. {
    6.     int r;
    7.     for(int i=0;i<256;i++)
    8.     {
    9.         r=((int)i)<<8;
    10.         for(byte j=0;j<8;j++)
    11.         {
    12.             if(r&(1<<15))r=(r<<1)^Polinom;
    13.             else r=r<<1;
    14.         }
    15.         CRC_16_table[i]=r;
    16.     }
    17. }
    18.  
    19. INT16 GetCRC_16(byte *buf, int len)
    20. {
    21.     INT8 crc;
    22.     crc = 0xFFFF;
    23.     while(len--)
    24.     {
    25.         crc = CRC_16_table[((crc>>8)^*buf++)&0xFF] ^ (crc<<8);
    26.     }
    27.     crc ^= 0xFFFF;
    28.     return crc;
    29. }
    Т.е. для полинома x16 + x15 + x2 + 1,надо будет сделать:
    CRC_16_create_table(0x8005);
    Зарранее благодарен,
    P.S.
    На википедии есть алгоритмы для CRC16 но они только для конкретных полиномов.
    Мне же важна универсальность и очень важно то на склько я правильно составил алгоритм.
     
  2. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    hawk
    Вроде правильно. Просто я видел другие алгоритм с обратным порядком бит, но в википедии указан именно ваш вариант.