- 论坛徽章:
- 0
|
今日遇到一个需要crc计算的地方,于是找crc函数,发现如后付的两个crc函数。可是我喂给他们同样的数据却得到不同的结果
我对比以前找到的其他函数,正向计算的结果互相一致,逆向计算的结果也互相一致。
想请教,如果我发的数据相同,比如我现在通过串口发送的序列0xaa0xaa 0x7e 0x01,公式ccitt 即多项式为1021(逆向后为804
是否他们计算的结果确实是不一致的,还是他们应该算出一致的结果来?
crc16l算出0xc3f7
crc16r算出0x7963
//-------------------------------------------------------------------------------------------------------------------------
网页摘来的函数
u_short crc16l(u_char *ptr,u_char len,u_short key) // ptr 为数据指针,len 为数据长度
{
u_char i;
u_short crc=0x0000;
while(len--)
{
for(i=0x80; i!=0; i>>=1)
{
if((crc&0x8000)!=0) {crc<<=1; crc^=key;}
else crc<<=1;
if((*ptr&i)!=0) crc^=key;
}
ptr++;
}
return(crc);
}
!反转多项式是指在数据通讯时,信息字节先传送或接收低位字节,如重新排位影响 CRC
计算速度,故设反转多项式。!如CRC16 1021的反转多项式是8408
u_short crc16r(u_char *ptr, u_char len,u_short key)
{
unsigned char i;
u_short crc=0x0000;
while(len--!=0)
{
for(i=0x01;i!=0;i <<= 1)
{
if((crc&0x0001)!=0) {crc >>= 1; crc ^= key;}
else crc >>= 1;
if((*ptr&i)!=0) crc ^= key;
}
ptr++;
}
return(crc);
} |
|