CRC校验源码分析.pdf
上传人:qw****27 上传时间:2024-09-12 格式:PDF 页数:5 大小:132KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

CRC校验源码分析.pdf

CRC校验源码分析.pdf

预览

在线预览结束,喜欢就下载吧,查找使用更方便

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

沈阳单片机开发网——帮您精确掌握电子器件的使用细节www.symcukf.comCRC校验源码分析CRC根据”权”(即多项表达式)的不同而相应的源代码也有稍许不同。以下是各种常用的权:CRC8=X8+X5+X4+1CRC-CCITT=X16+X12+X5+1CRC16=X16+X15+X5+1CRC12=X12+X11+X3+X2+1CRC32=X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+1不同权的CRC算法其本质都一样,搞明白一种,其他的迎刃而解。以下的源程序全部以CCITT为例。图1,图2说明了CRC校验中CRC值是如何计算出来的,体现的多项式正是X16+X12+X5+1。“SerialData”即是需要校验的数据。从把数据移位开始计算,将数据位(从最低的数据位开始)逐位移入反向耦合移位寄存器。当所有数据位都这样操作后,计算结束。此时,16位移位寄存器中的内容就是CRC码。图中进行XOR异或运算的位与多项式的表达相对应。X5代表Bit5,X12代表Bit12,1代表Bit0,X16比较特别,是指移位寄存器移出的数据,即图中的“DATAOUT”。可以这样理解,与数据位做XOR运算的是上次CRC值的Bit15。1沈阳单片机开发网——帮您精确掌握电子器件的使用细节www.symcukf.com根据以上说明,可以写出以下程序:typedefunsignedcharuchar;typedefunsignedintuint;codeucharcrcbuff[]={0x00,0x00,0x00,0x00,0x06,0x0d,0xd2,0xe3};uintcrc;//CRC码voidmain(void){uchar*ptr;crc=0;//CRC初值ptr=crcbuff;//指向第一个Byte数据crc=crc16(ptr,8);while(1);}uintcrc16(uchar*ptr,ucharlen)//ptr为数据指针,len为数据长度{uchari;while(len--){for(i=0x80;i!=0;i>>=1){if((crc&0x8000)!=0){crc<<=1;crc^=0x1021;}//1-1elsecrc<<=1;//1-2if((*ptr&i)!=0)crc^=0x1021;//1-3}ptr++;}return(crc);}执行结果crc=0xdbc0;程序1-1,1-2,1-3可以理解成移位前crc的Bit15与数据对应的Bit(*ptr&i)做XOR运算,根据此结果来决定是否执行crc^=0x1021。只要明白两次异或运算与原值相同,就不难理解这个程序。很多资料上都写了查表法来计算,这很简单。假设通过移位处理了8个bit的数据,相当于把之前的CRC码的高字节(8bit)全部移出,与一个byte的数据做XOR运算,根据运算结果来选择一个值(称为余式),与原来的CRC码再做一次XOR运算,就可以得到新的CRC码。不难看出,余式有256种可能的值,实际上就是0~255以X16+X12+X5+1为权得到的CRC码,可以通过函数crc16来计算。以1为例。codetest[]={0x01};crc=0;ptr=test;crc=crc16(ptr,1);执行结果crc=1021,这就是1对应的余式。进一步修改函数,可得到X16+X12+X5+1的余式表。2沈阳单片机开发网——帮您精确掌握电子器件的使用细节www.symcukf.comcodeuintcrc_ta[256]={//X16+X12+X5+1余式表(CRC-CCITT)0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef,0x1231,0x0210,0x3273,0x2252,0x52b5,0x4294,0x72f7,0x62d6,0x9339,0x8318,0xb37b,0xa35a,0xd3bd,0xc39c,0xf3ff,0xe3de,0x2462,0x3443,0x0420,0x1401,0x64e6,0x74c7,0x44a4,0x5485,0xa56a,0xb54b,0x8528,0x9509,0xe5ee,0xf5cf,0xc5ac,0xd58d,0x3653,0x2672,0x1611,0x0630,0x76d7,0x6