免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 11832 | 回复: 2
打印 上一主题 下一主题

[算法] 正向和逆向crc的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-10-12 18:22 |只看该作者 |倒序浏览
今日遇到一个需要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);
}

论坛徽章:
0
2 [报告]
发表于 2009-10-13 09:00 |只看该作者
自己顶一下,望高手指教!

论坛徽章:
0
3 [报告]
发表于 2024-02-29 11:13 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP