Можно и без таблицы обойтись, если памяти не хватает. Пример. внутри.
//===============================================
// Функция подсчета СRC16 по алгоритму
//-----------------------------------------------
//аргументы: указатель на буфер,
// размер буфера,
// стартовое значение СRC16
//возвращает:подсчитанное значение СRC16
//ВНИМАНИЕ: Стартовому значению CRC16 необходимо
// присвоить значение 0xFFFF,
// размер массива для подсчета CRC16
// не более 65535 байт
//===============================================
#define _POLINOME_CRC16_ 0xA001
xWord f_CRC16Calc(xByte *buf, xWord sizeBuf, xWord crc)
{ xWord i, j;
for(i=0;i<sizeBuf;i++)
{ crc=crc^buf[i];
for (j=0;j<8;j++)
{ if ((crc&0x0001)!=0x0000) crc=(crc>>1)^_POLINOME_CRC16_;
else crc>>=1;
}
}
return (crc);
}
xByte и xWord это типы данных unsigned char и unsigned short соответственно