[C语言] 请教CRC16校验

[复制链接]
1863|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一下看看。
NWPU_CHEN 发表于 2014-7-8 11:03 | 显示全部楼层
CRC校验不同位数的校验,校验多项式不同结果也不同,除过查表法,网上也有另一种计算法,这个东西都有源码,建议你看看crc校验原理,自然明白上述程序中变量的意思
 楼主| 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为发送的数据序列。其它的就没了。
 楼主| 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 —要校验的数组


         
cjseng 发表于 2014-7-10 21:59 | 显示全部楼层
其实我讨厌多项式这个说法,我不知道多项式跟0x11021这个有什么关系,不如直接把0x11021
这个数字给出就行了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

23

主题

112

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部