资源描述:
《CRC校验用处是这样,设有一帧数据,根据某种规则,》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、CRC校验的用处是这样的,设有一帧数据,根据某种规则,由这帧数据得到一个或多个字节,我们称这一个或多个字节就是一个CRC码,将这帧数据加上这个CRC码一起发送出去,接收方接到这帧数据和CRC码,采用相同的规则,由这帧数据得到一个CRC码,如果这个由接收方计算出来的CRC码和接收到的CRC码一样(这里一般认为CRC码不会在传送过程中出错),就说明这帧数据在传送过程中没有出错。如果不一样,就说明这帧数据在传送中出错了,可以通知发送方重新发送。这就是CRC码存在的价值。从网上搜索到的资料来看,对CRC的介绍往往建立在较抽象的数据基础上,这样不易于让读者迅速地掌握,甚而望而却步。对于工科学生来说,我们
2、往往更关心的是能否正确使用,而不必事事都追根溯源。我更倾向于思索事理的存在性。设有一帧数据,为简单起见,设这帧数据就由一个字节组成,设这个字节为0xA0,将该字节左移8位,和0x107做移位异或运算,最后取‘余’(这里的余数和我们小学学习的除法上的余数是不一样了),得出的‘余数’就是CRC码。其具体实施过程如图1所示。图1最终结果为0x69,它就是CRC码。根据图1对应的执行过程编写VC程序,如图2所示。#includeintlength=8;unsignedintjiaoyan=0x0107;intxinxilen=1;unsignedcharxinxi[1]={0x
3、A0};//,0x0C,0x34,0x00,0x03,0xAA,0x00,0x03,0xAE,0x00};//88//unsignedcharxinxi[18]={0xA0,0x00,0x05,0xBC,0x00,0x01,0x88,0x00,0x05,0xAB,0x00,0x0E,0x92,0x0F,0x12,0x10,0x20,0x6D};//8C//unsignedcharxinxi[18]={0xA0,0xFF,0xF6,0xDD,0xFF,0xF6,0x5C,0x00,0x07,0x81,0x00,0x0E,0x92,0x0F,0x12,0x10,0x23};//D9//unsign
4、edcharxinxi[18]={0xA0,0x00,0x00,0xE8,0xFF,0xFC,0x1B,0xFF,0xFB,0xC6,0x00,0x0E,0x92,0x0F,0x12,0x10,0x23,0xab};//98unsignedchar*pXinxiNew;voidSetpXinxiNew(){pXinxiNew=newunsignedchar[xinxilen+1];for(inti=0;i5、rn0;for(inti=0;i<32;i++){ans=ans>>1;if(ans==0)returni+1;}returni;}unsignedintGetAddPart_sub(intpos1,intpos2){unsignedintzuhe=0;if(pos1==pos2)zuhe=pXinxiNew[pos1];elsefor(inti=pos1;i<=pos2;i++){zuhe=zuhe<<8;zuhe=zuhe+pXinxiNew[i];}returnzuhe;}unsignedintGetAddPart(intstart,intfinish){for(inti=0;i<=xi
6、nxilen;i++)if(8*(i+1)>=start)break;intpos1=i;for(i=0;i<=xinxilen;i++)if(8*(i+1)>=finish)break;intpos2=i;unsignedintzuhe=GetAddPart_sub(pos1,pos2);zuhe=zuhe>>((pos2+1)*8-finish);unsignedintsum=0,temp=0x01;for(i=0;i<=(finish-start);i++){sum=temp+sum;temp=temp<<1;}zuhe=zuhe∑returnzuhe;}unsignedintG
7、etNewPart(unsignedintans,int&pos){unsignedintpart=0;intlen=GetBitLen(ans);intpos1=pos+1;intpos2=pos+1+(length+1-len)-1;pos=pos2;unsignedintaddpart=GetAddPart(pos1,pos2);part=(ans<<(pos2-pos1+1))
8、addpa