Самый тривиальный алгоритм подсчета контрольной суммы CRC16:
Код
WORD calc_crc16(WORD *ar,int num)
{
WORD i,j,val,val1;
val=ar[0];
for(i=1;i<num;i++)
{
val1=ar[i];
for(j=0;j<16;j++)
{
if(val&0x8000)
{
val=val^0x8005;
}
val=(val<<1);
if(val1&0x8000)
{
val++;
}
val1=(val1<<1);
}
}
ar[i-1]=val;
return(val);
}
Последний элемент массива - значение CRC16 массива при проверке (возвращается 0 при правильной CRC16), 0 - при подсчете. Оптимизируйте при необходимости - я написал в свое время за 15 минут, совершенно не думая о производительности.