CRC校验实用程序库_第1页
CRC校验实用程序库_第2页
CRC校验实用程序库_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、CRC校验实用程序库     在数据存储和数据通讯领域,为了保证数据的正确,就不得不采用检错的手段。在诸多检错手段中,CRC是最著名的一种。CRC的全称是循环冗余校验,其特点是:检错能力极强,开销小,易于用编码器及检测电路实现。从其检错能力来看,它所不能发现的错误的几率仅为0.0047%以下。从性能上和开销上考虑,均远远优于奇偶校验及算术和校验等方式。因而,在数据存储和数据通讯领域,CRC无处不在:著名的通讯协议X.25的FCS(帧检错序列)采用的是CRC-CCITT,ARJ、LHA等压缩工具软件采用的是CRC32,磁盘驱动器的读写采用了CRC16,通用

2、的图像存储格式GIF、TIFF等也都用CRC作为检错手段。CRC的本质是模-2除法的余数,采用的除数不同,CRC的类型也就不一样。通常,CRC的除数用生成多项式来表示。最常用的CRC码的生成多项式如表1所示。10A08800.GIF;表1.最常用的CRC码及生成多项式由于CRC在通讯和数据处理软件中经常采用,笔者在实际工作中对其算法进行了研究和比较,总结并编写了一个具有最高效率的CRC通用程序库。该程序采用查表法计算CRC,在速度上优于一般的直接模仿硬件的算法,可以应用于通讯和数据压缩程序。通常的CRC算法在计算一个数据段的CRC值时,其CRC值是由求解每个数值的CRC值的和对CRC寄存器的值

3、反复更新而得到的。这样,求解CRC的速度较慢。通过对CRC算法的研究,我们发现:一个8位数据加到16位累加器中去,只有累加器的高8位或低8位与数据相作用,其结果仅有256种可能的组合值。因而,我们可以用查表法来代替反复的运算,这也同样适用于CRC32的计算。本文所提供的程序库中,函数crchware是一般的16位CRC的算法;mk-crctbl用以在内存中建立一个CRC数值表;crcupdate用以查表并更新CRC累加器的值;crcrevhware和crcrevupdate是反序算法的两个函数;BuildCRCTable、CalculateBlockCRC32和UpdateCharacterC

4、RC32用于CRC32的计算。/* CRC.CCRC程序库 */#define CRCCCITT 0x1021#define CCITT-REV 0x8408#define CRC16 0x8005#define CRC16-REV 0xA001#define CRC32-POLYNOMIAL 0xEDB88320L/* 以上为CRC除数的定义 */#define NIL 0#define crcupdate(d,a,t)*(a)=(*(a)<<8)(t)(*(a)>>8)(d);#define crcupdate16(d,a,t)*(a)=(*(a)>>8

5、(t)(*(a)(d)&0x00ff)/* 以上两个宏可以代替函数crcupdate和crcrevupdate */#include<stdio.h>#include<stdlib.h>#include<alloc.h>/* 函数crchware是传统的CRC算法,其返回值即CRC值 */unsigned short crchware(data,genpoly,accum)unsigned short data;/* 输入的数据 */unsigned short genpoly;/* CRC除数 */unsigned short accum;/* C

6、RC累加器值 */static int i;data<<=8;for(i=8;i>0;i-)if(dataaccum)&0x8000)accum=(accum<<1)genpoly;elseaccum<<=1;data<<=1;return (accum);/* 函数mk-crctbl利用函数crchware建立内存中的CRC数值表 */unsigned short *mk-crctbl(poly,crcfn);unsigned short poly;/* CRC除数-CRC生成多项式 */unsigned short (*crcf

7、n)();/* 指向CRC函数(例如crchware)的指针 */* unsigned short */malloc(); */unsigned short *crctp;int i;if(crctp=(unsigned short*)malloc(256*sizeof(unsigned)=0)return 0;for(i=0;i<256;i+)crctpi=(*crcfn)(i,poly,0);return crctp;/* 函数mk-crctbl的使用范例 */if(crctblp=mk-crctbl(CRCCCITT,crchware)=NIL)puts("insuff

8、memory for CRC lookup table.n");return 1; */* 函数crcupdate用以用查表法计算CRC值并更新CRC累加器值 */void crcupdate(data,accum,crctab)unsigned short data;/* 输入的数据 */unsigned short *accum;/* 指向CRC累加器的指针 */unsigned short *crctab;/* 指向内存中CRC表的指针 */static short comb-val;comb-val=(*accum>>8)data;*accum=(*accum&l

9、t;<8)crctabcomb-val;/* 函数crcrevhware是传统的CRC算法的反序算法,其返回值即CRC值 */unsigned short crcrevhware(data,genpoly,accum)unsigned short data;unsigned short genpoly;unsigned short accum;static int i;data<<=1;for(i=8;i>0;i-)data>>=1;if(dataaccum)&0x0001)accum=(accum>>1)genpoly;elseaccum>>=1;re

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论