c语言crc校验库函数,CRC校验原理及其C语言实现

41528d3028836879cd698677c3999917.gifCRC校验原理及其C语言实现

CRC校验码的基本思想是利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的监督码(既CRC码)r位,并附在信息后边,构成一个新的二进制码序列数共(k+ r)位,最后发送出去。在接收端,则根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。 在数据存储和数据通讯领域,CRC无处不在:著名的通讯协议X.25的FCS(帧检错序列)采用的是CRC. CCITT,ARJ、LHA等压缩工具软件采用的是CRC32,磁盘驱动器的读写采用了CRC16,通用的图像存储格式GIF、TIFF等也都用CRC作为检错手段。 CRC的本质是模-2除法的余数,采用的除数不同,CRC的类型也就不一样。通常,CRC的除数用生成多项式来表示。最常用的CRC码的生成多项式有CRC16,CRC32. 以CRC16为例,16位的CRC码产生的规则是先将要发送的二进制序列数左移16位(既乘以2^16)后,再除以一个多项式,最后所得到的余数既是 CRC码,如下式所示,其中K(X)表示n位的二进制序列数,G(X)为多项式,Q(X)为整数,R(X)是余数(既CRC码)。 K(X)>>16=G(x)Q(x)+R(x) 求CRC码所采用模2加减运算法则,既是不带进位和借位的按位加减,这种加减运算实际上就是逻辑上的异或运算,加法和减法等价,乘法和除法运算与普通代数式的乘除法运算是一样,符合同样的规律。生成CRC码的多项式如下,其中CRC-16和CRC-CCITT产生16位的CRC码,而CRC-32则产生的是32位的CRC码 PLC资料网 接收方将接收到的二进制序列数(包括信息码和CRC码)除以多项式,如果余数为0,则说明传输中无错误发生,否则说明传输有误,关于其原理这里不再多述。用软件计算CRC码时,接收方可以将接收到的信息码求CRC码,比较结果和接收到的CRC码是否相同。 CCITT推荐的高级数据链路控制规程HDLC的帧校验序列FCS中,使用CCITT-16即CRC16,其生成多项式为G(x)=x16+x12+x5 +1, CRC-32的生成多项式为G(x)=x32+x26+x23+x22+x16+x11+x10+x16+x8+x7+x5+x4+x2+x+1 以上是摘录的一段介绍,是不是觉得很玄?我第一次看也是觉得很晕,后来查询了一些规约和协议的实现资料以后,才恍然大悟。以下是我实现的一段C++代码,只实现了CRC16,CRC32的实现基本类似,网上有很多资源。其实实现起来非常简单,就是查表、异或运算而已!查表法实现起来比较简单,耗资源也比较少,速度较快。只要通信双方采用的同样的余数表,就可以正确进行CRC校验。余数表并没有硬性规定。许多程序还把余数表做成自动生成,那样适用性就更好了。 //CRC计算主函数: //内容: #include “CrcCode.h“ PLC using namespace std; unsigned short int CrcCode::CrcCode16(const char *CrcSrcCode,const size_t CodeLength) { unsigned short CRC_Code[]={ 0 x0673,0 x1652,0 x2631,0 x3610,0 x46F7,0 x56D6,0 x66B5,0 x7694,0 x877B,0 x975A,//10 0 xA739,0 xB718,0 xC7FF,0 xD7DE,0 xE7BD,0 xF79C,0 x1442,0 x0463,0 x3400,0 x2421,//20 0 x54C6,0 x44E7,0 x7484,0 x64A5,0 x954A,0 x856B,0 xB508,0 xA529,0 xD5CE,0 xC5EF,//30 0 xF58C,0 xE5AD,0 x2211,0 x3230,0 x0253,0 x1272,0 x6295,0 x72B4,0 x42D7,0 x52F6,//40 0 xA319,0 xB338,0 x835B,0 x937A,0 xE39D,0 xF3BC,0 xC3DF,0 xD3FE,0 x3020,0 x2001,//50 0 x1062,0 x0043,0 x70A4,0 x6085,0 x50E6,0 x40C7,0 xB128,0 xA109,0 x916A,0 x814B,//60 PLC资料网 0 xF1AC,0 xE18D,0 xD1EE,0 xC1CF,0 x4EB7,0 x5E96,0 x6EF5,0 x7ED4,0 x0E33,0 x1E12,//70 0 x2E71,0 x3E50,0 xCFBF,0 xDF9E,0 xEFFD,0 xFFDC,0 x8F3B,0 x9F1A,0 xAF79,0 xBF58,//80 0 x5C86,0 x4CA7,0 x7CC4,0 x6CE5,0 x1C02,0 x0C23,0 x3C40,0 x2C61,0 xDD8E,0 xCDAF,//90 0 xFDCC,0 xEDED,0 x9D0A,0 x8D2B,0 xBD48,0 xAD69,0 x6AD5,0 x7AF4,0 x4A97,0 x5AB6,//100 0 x2A51,0 x3A70,0 x0A13,0 x1A32,0 xEBDD,0 xFBFC,0 xCB9F,0 xDBBE,0 xAB59,0 xBB78,//110 0 x8B1B,0 x9B3A,0 x78E4,0 x68C5,0 x58A6,0 x4887,0 x3860,0 x2841,0 x1822,0 x0803,//120 0 xF9EC,0 xE9CD,0 xD9AE,0 xC98F,0 xB968,0 xA949,0 x992A,0 x890B,0 x97FB,0 x87DA,//130 PLC 0 xB7B9,0 xA798,0 xD77F,0 xC75E,0 xF73D,0 xE71C,0 x16F3,0 x06D2,0 x36B1,0 x2690,//140 0 x5677,0 x4656,0 x7635,0 x6614,0 x85CA,0 x95EB,0 xA588,0 xB5A9,0 xC54E,0 xD56F,//150 0 xE50C,0 xF52D,0 x04C2,0 x14E3,0 x2480,0 x34A1,0 x4446,0 x5467,0 x6404,0 x7425,//160 0 xB399,0 xA3B8,0 x93DB,0 x83FA,0 xF31D,0 xE33C,0 xD35F,0 xC37E,0 x3291,0 x22B0,//170 0 x12D3,0 x02F

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值