Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > CRC


Автор: hawk3500 17.6.2011, 19:22
Здравствуйте.
Подскажит кто знает, 
правильно ли я сделал алгоритм подсчёта CRC16.
Алгоритм предполагает универсальность-т.е.полином задаёт пользователь.

Код

INT16 CRC_16_table[256];


void CRC_16_create_table(INT64 Polinom)
{
    int r;
    for(int i=0;i<256;i++)
    {
        r=((int)i)<<8;
        for(byte j=0;j<8;j++)
        {
            if(r&(1<<15))r=(r<<1)^Polinom;
            else r=r<<1;
        }
        CRC_16_table[i]=r;
    }
}

INT16 GetCRC_16(byte *buf, int len)
{
    INT8 crc;
    crc = 0xFFFF;
    while(len--)
    {
        crc = CRC_16_table[((crc>>8)^*buf++)&0xFF] ^ (crc<<8);
    }
    crc ^= 0xFFFF;
    return crc;
}


Т.е. для полинома x16 + x15 + x2 + 1,надо будет сделать:
CRC_16_create_table(0x8005);
Зарранее благодарен,
с уважением Hawk.

Автор: fish9370 17.6.2011, 21:10
а что такое полином? это математический термин?

как я понимаю CRC16 - это подсчет контрольной суммы, 16-разрядных слов

как например вычисление контрольной суммы IP заголовка:

Код

unsigned short in_cksum(unsigned short *addr, int len)
{
  unsigned short result;
  unsigned int sum = 0;

  /* складываем все двухбайтовые слова */
  while (len > 1) {
    sum += *addr++;
    len -= 2;
  }

  /* если остался лишний байт, добавляем его */
  if (len == 1)
    sum += *(unsigned char*) addr;

  sum = (sum >> 16) + (sum & 0xFFFF); /* добавляем перенос */
  sum += (sum >> 16);               /* еще раз */
  result = ~sum;                    /* инвертируем результат (сумма в обратном коде) */
  return result;
}



и что это у тебя за такие типы данных? 
они несколько нестандартные..

Автор: bsa 17.6.2011, 21:37
hawk3500, то, что ты сделал - это не функция расчет CRC, а функция генерация таблицы для расчета CRC.
Вот http://ru.wikipedia.org/wiki/%D0%A6%D0%B8%D0%BA%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B8%D0%B7%D0%B1%D1%8B%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4, есть специализированные функции. Тебе необходимо сделать проверочную функцию, и протестировать свою на разных полиномах и наборе случайных чисел.

Автор: hawk3500 17.6.2011, 22:31
 GetCRC_16 это для получения уже crc.
bsa подскажите пожалуйста, а функция расчёта таблицы верная?
Да на википедии я смотрел, но универсальности там нет...

Автор: afiskon 18.6.2011, 14:39
http://ru.wikipedia.org/wiki/CRC#CRC-16

Автор: hawk3500 18.6.2011, 18:23
....я в посте уже писал что в википедии я смотрел smile 

А вот правильно ли сделан приведённый выше алгоритм.....вот не знаю.
Хотелось бы услышать ответ именно на этот вопрос.

Автор: bsa 19.6.2011, 21:22
hawk3500, возьми проверь на случайных данных.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)