关闭

关闭

关闭

封号提示

内容

首页 crc校验原理及c实现.doc

crc校验原理及c实现.doc

crc校验原理及c实现.doc

上传者: lin立祥 2017-10-10 评分 0 0 0 0 0 0 暂无简介 简介 举报

简介:本文档为《crc校验原理及c实现doc》,可适用于高等教育领域,主题内容包含crc校验原理及c实现CRC校验码的基本思想是利用线性编码理论在发送端根据要传送的k位二进制码序列以一定的规则产生一个校验用的监督码(既CRC码)r符等。

crc校验原理及c实现CRC校验码的基本思想是利用线性编码理论在发送端根据要传送的k位二进制码序列以一定的规则产生一个校验用的监督码(既CRC码)r位并附在信息后边构成一个新的二进制码序列数共(kr)位最后发送出去。在接收端则根据信息码和CRC码之间所遵循的规则进行检验以确定传送中是否出错。在数据存储和数据通讯领域CRC无处不在:著名的通讯协议X的FCS(帧检错序列)采用的是CRCCCITTARJ、LHA等压缩工具软件采用的是CRC磁盘驱动器的读写采用了CRC通用的图像存储格式GIF、TIFF等也都用CRC作为检错手段。CRC的本质是模除法的余数采用的除数不同CRC的类型也就不一样。通常CRC的除数用生成多项式来表示。最常用的CRC码的生成多项式有CRC,CRC以CRC为例,位的CRC码产生的规则是先将要发送的二进制序列数左移位(既乘以^)后再除以一个多项式最后所得到的余数既是CRC码如下式所示其中K(X)表示n位的二进制序列数G(X)为多项式Q(X)为整数R(X)是余数(既CRC码)。K(X)>>=G(x)Q(x)R(x)求CRC码所采用模加减运算法则既是不带进位和借位的按位加减这种加减运算实际上就是逻辑上的异或运算加法和减法等价乘法和除法运算与普通代数式的乘除法运算是一样符合同样的规律。生成CRC码的多项式如下其中CRC和CRCCCITT产生位的CRC码而CRC则产生的是位的CRC码接收方将接收到的二进制序列数(包括信息码和CRC码)除以多项式如果余数为则说明传输中无错误发生否则说明传输有误关于其原理这里不再多述。用软件计算CRC码时接收方可以将接收到的信息码求CRC码比较结果和接收到的CRC码是否相同。CCITT推荐的高级数据链路控制规程HDLC的帧校验序列FCS中使用CCITT即CRC,其生成多项式为G(x)=xxx,CRC的生成多项式为G(x)=xxxxxxxxxxxxxx以上是摘录的一段介绍是不是觉得很玄,我第一次看也是觉得很晕后来查询了一些规约和协议的实现资料以后才恍然大悟。以下是我实现的一段C代码只实现了CRCCRC的实现基本类似网上有很多资源。其实实现起来非常简单就是查表、异或运算而已~查表法实现起来比较简单耗资源也比较少速度较快。只要通信双方采用的同样的余数表就可以正确进行CRC校验。余数表并没有硬性规定。许多程序还把余数表做成自动生成那样适用性就更好了。CRC计算主函数:内容:#include"CrcCodeh"usingnamespacestdunsignedshortintCrcCode::CrcCode(constchar*CrcSrcCode,constsizetCodeLength){unsignedshortCRCCode={x,x,x,x,xF,xD,xB,x,xB,xA,xA,xB,xCFF,xDDE,xEBD,xFC,x,x,x,x,xC,xE,x,xA,xA,xB,xB,xA,xDCE,xCEF,xFC,xEAD,x,x,x,x,x,xB,xD,xF,xA,xB,xB,xA,xED,xFBC,xCDF,xDFE,x,x,x,x,xA,x,xE,xC,xB,xA,xA,xB,xFAC,xED,xDEE,xCCF,xEB,xE,xEF,xED,xE,xE,xE,xE,xCFBF,xDFE,xEFFD,xFFDC,xFB,xFA,xAF,xBF,xC,xCA,xCC,xCE,xC,xC,xC,xC,xDDE,xCDAF,xFDCC,xEDED,xDA,xDB,xBD,xAD,xAD,xAF,xA,xAB,xA,xA,xA,xA,xEBDD,xFBFC,xCBF,xDBBE,xAB,xBB,xBB,xBA,xE,xC,xA,x,x,x,x,x,xFEC,xECD,xDAE,xCF,xB,xA,xA,xB,xFB,xDA,xBB,xA,xDF,xCE,xFD,xEC,xF,xD,xB,x,x,x,x,x,xCA,xEB,xA,xBA,xCE,xDF,xEC,xFD,xC,xE,x,xA,x,x,x,x,xB,xAB,xDB,xFA,xFD,xEC,xDF,xCE,x,xB,xD,xF,x,x,x,x,xAA,xB,xEA,xCB,xEC,xFD,xCE,xDF,xA,x,xE,xC,x,x,x,x,xDFF,xCFE,xFFD,xEFC,xFBB,xFA,xBFF,xAFD,xE,xE,xE,xE,xEB,xE,xEF,xED,xCDE,xDDF,xEDC,xFDD,xDA,xDAB,xADC,xBDE,xC,xC,xC,xC,xC,xCA,xCC,xCE,xFBD,xEBC,xDBF,xCBE,xBBD,xABF,xBB,xBBA,xA,xA,xA,xA,xAD,xAF,xA,xAB,xEC,xFD,xCE,xDF,xAE,xBC,xAA,xB,x,x,x,x,xE,xC,xA,x}CRCCode数组就是一个余数表unsignedshortintnCrcCode=unsignedshortintlocation=for(sizeti=i!=CodeLengthi){location=(nCrcCodexff)^(CrcSrcCodeixff)查表事实上就是获取该余数在CRCCode数组的中的位置nCrcCode=((nCrcCode>>)xff)^CRCCodelocation从表中取值计算}std::cout<<"TheCrcCodeyouneedis:"<<nCrcCode<<endlreturnnCrcCode}当然了你要做的就是给它传递参数也就是你要计算的数据char类型。一般的串口通信、网络通信都是字符型通信更适用于LINUX里面的字符型设备。这个类是在Suse下面用Kdevelop写的全部使用ANSICC编写在Linux和Windows均可以编译通过并且正确运行。************************************************************crc校验程序uintcrc(uintcrcdata,ucharbufdata)形参:bufdata需要校验数据crcdata校验后的数据功能:接收字节crc校验返回校验值*************************************************************uintcrc(uintcrcdata,ucharbufdata){ucharicrcdata^=bufdatafor(i=i>i){crcdata>>=if(crcdatax)crcdata^=xa}returncrcdata}VBvbvbvbvbvbvbvvvvvvvvvvvvvvvvvvbbbbbbbbbbbbbbbbbbPrivateSubCommandClick()DimCRC()AsByteDimd()AsByte'待传输数据ReDimd()AsByted()='lohiAd()=d()=d()=d()=d()='hiELoECRC=CRC(d)'调用CRC计算函数'CRC()为高位'CRC()为低位EndSub'注意:在数据传输时CRC的低位可能在前而高位在后。FunctionCRC(data()AsByte)AsStringDimCRCLoAsByte,CRCHiAsByte'CRC寄存器DimCLAsByte,CHAsByte'多项式码HADimSaveHiAsByte,SaveLoAsByteDimiAsIntegerDimFlagAsIntegerCRCLo=HFFCRCHi=HFFCL=HCH=HAFori=ToUBound(data)CRCLo=CRCLoXordata(i)'每一个数据与CRC寄存器进行异或ForFlag=ToSaveHi=CRCHiSaveLo=CRCLoCRCHi=CRCHi'高位右移一位CRCLo=CRCLo'低位右移一位If((SaveHiAndH)=H)Then'如果高位字节最后一位为CRCLo=CRCLoOrH'则低位字节右移后前面补EndIf'否则自动补If((SaveLoAndH)=H)Then'如果LSB为则与多项式码进行异或CRCHi=CRCHiXorCHCRCLo=CRCLoXorCLEndIfNextFlagNextiDimReturnData()AsByteReturnData()=CRCHi'CRC高位ReturnData()=CRCLo'CRC低位CRC=ReturnDataEndFunction

用户评论(0)

0/200

精彩专题

上传我的资料

每篇奖励 +2积分

资料评价:

/8
0下载券 下载 加入VIP, 送下载券

意见
反馈

立即扫码关注

爱问共享资料微信公众号

返回
顶部