打印
[C语言]

请教CRC16校验

[复制链接]
1594|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
langgao183|  楼主 | 2014-7-7 17:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 langgao183 于 2014-7-7 17:59 编辑

第一次接触crc校验,无从下手。大牛们帮我解答解答,如何算的,先谢啦
xcrc(crc,cp)=crctab[((crc>>8)&0xFF) ^ (cp&0xFF)] ^ (crc<<8)

例如:0x01  0x01 0x05 0x00 的crc值是多少?

相关帖子

沙发
xjjspace| | 2014-7-7 21:20 | 只看该作者
不知道你是这句代码没看懂,还是CRC校验的概念不清。
如果是前者,可以回顾一下C语言基础,后者的话可以百度“CRC校验”,看完你就差不多懂了,其实就是一种规则。

使用特权

评论回复
板凳
langgao183|  楼主 | 2014-7-8 08:17 | 只看该作者
xjjspace 发表于 2014-7-7 21:20
不知道你是这句代码没看懂,还是CRC校验的概念不清。
如果是前者,可以回顾一下C语言基础,后者的话可以百 ...

是CRC校验不清楚,像这些crc cp都不知道什么什么意思

使用特权

评论回复
地板
NE5532| | 2014-7-8 08:21 | 只看该作者
CRC查表的快速算法,要得到值,还的需要表的数据,另外表的生成多项式不同,结果也可能不同,典型的生成多项式如IBM、CCITT,楼主google一下看看。

使用特权

评论回复
5
NWPU_CHEN| | 2014-7-8 11:03 | 只看该作者
CRC校验不同位数的校验,校验多项式不同结果也不同,除过查表法,网上也有另一种计算法,这个东西都有源码,建议你看看crc校验原理,自然明白上述程序中变量的意思

使用特权

评论回复
6
langgao183|  楼主 | 2014-7-8 16:56 | 只看该作者
NE5532 发表于 2014-7-8 08:21
CRC查表的快速算法,要得到值,还的需要表的数据,另外表的生成多项式不同,结果也可能不同,典型的生成多 ...

它有给256个16位值的表,和公式:新CRC值xcrc(crc,cp)=crctab[((crc>>8)&0xFF) ^ (cp&0xFF)] ^ (crc<<8) 还说cp为发送的数据序列。其它的就没了。

使用特权

评论回复
7
langgao183|  楼主 | 2014-7-10 17:51 | 只看该作者
首先应先确定CRC16的多项式。
我使用的是
           多项式:CRC-CCITT=x^16+x^12+x^5+1  即:0x11021
利用多项式生成crc的生成表。表较大,不上传。

计算crc校验

unsigned int CrcCheck(unsigned char len,unsigned int *ptr)
{
   unsigned int crc = 0;
   unsigned char crc_H8;

  while( len-- )
    {
        crc_H8 = (unsigned char)(crc >> 8);
        crc = crc << 8;
        crc = crc ^ crc_table[ crc_H8 ^ *ptr];
        ptr++;
    }
return crc;
}

len  —要校验的字节数
*ptr —要校验的数组


         

使用特权

评论回复
8
cjseng| | 2014-7-10 21:59 | 只看该作者
其实我讨厌多项式这个说法,我不知道多项式跟0x11021这个有什么关系,不如直接把0x11021
这个数字给出就行了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

23

主题

112

帖子

1

粉丝