教育资源为主的文档平台

当前位置: 查字典文档网> 所有文档分类> 论文> 其他论文> CRC校验实用程序库

CRC校验实用程序库

上传者:网友
|
翻新时间:2023-03-27

CRC校验实用程序库

CRC校验实用程序库 CRC校验实用程序库 CRC校验实用程序库

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

CRC的本质是模-2除法的余数,采用的除数不同,CRC的类型也就不一样。通常,CRC的除数用生成多项式来表示。最常用的CRC码的生成多项式如表1所示。

@@10A08800.GIF;表1.最常用的CRC码及生成多项式@@

由于CRC在通讯和数据处理软件中经常采用,笔者在实际工作中对其算法进行了研究和比较,总结并编写了一个具有最高效率的CRC通用程序库。该程序采用查表法计算CRC,在速度上优于一般的直接模仿硬件的算法,可以应用于通讯和数据压缩程序。terCRC32用于CRC32的计算。

/* CRC.C——CRC程序库 */#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^(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;/* CRC累加器值 */

{

static int i;

data<<=8;

for(i=8;i>0;i--)

{

if((data^accum)&0x8000)

accum=(accum<<

1)^genpoly;

else

accum<<=1;

data<<=1;

}

return (accum);

}

/* 函数mk-crctbl利用函数crchware建立内存中的CRC数值表 */

unsigned short *mk-crctbl(poly,crcfn);

unsigned short poly;/* CRC除数--CRC生成多项式 */

unsigned short (*crcfn)();/* 指向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++)

crctp[i]=(*crcfn)(i,poly,0);

return crctp;

}

/* 函数mk-crctbl的使用范例 */

if((crctblp=mk-crctbl(CRCCCITT,crchware))==NIL)

{

puts("insuff 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<<

8)^crctab[comb-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((data^accum)&0x000

1)

accum=(accum>>

1)^genpoly;

else

accum>>=1;

}

return accum;

}

/* 函数crcrevupdate用以用反序查表法计算CRC值并更新CRC累加器值 */

void crcrevupdate(data,accum,crcrevtab)

unsigned short data;

unsigned short *accum;

下载文档

版权声明:此文档由查字典文档网用户提供,如用于商业用途请与作者联系,查字典文档网保持最终解释权!

网友最新关注

梅花赞
都怪我
月球
天空下的永恒
我的苦与乐
夏日的阳光
我的可爱小猫“咪咪”
友谊,你会永远在
My fathers Day
我学会了打电脑
人类的老师
My family
古会
爸爸我想对您说
《福尔摩斯探案集》读后感
区卫生局2012年工作计划
2011年血防工作计划
2011学年度第一学期卫生工作计划
2012年卫生工作计划
2012年医院文明创建工作计划
2011年疾病预防控制工作要点
2011—2012年度下学期学校卫生工作计划
公司安全生产月活动方案
2011年卫生院妇幼工作管理计划
2012年下学期体育卫生工作计划
村委会2011年度爱国卫生工作计划
2011年卫生院防疫工作计划
2011年2月—2011年7月保健组工作计划
维中2007级4班传染病防治安全预案
工商局关于二OO五年创建“安全单位”的工作计划
免费毕业论文--PLC在大小球分类控制中的应用(一)
熟悉PIC系列单片机的开发环境及简单编程(一)
由商谈论谈法律的重构(1)论文
免费毕业论文--经济型数控卧式铣床电气控制系统(一)
浅析拈链型系统的机制
木材干燥窑全自动控制系统的研究
网络词语规范的原则与途径新探索
网络交际语言的特征及其对英语发展的影响
预售商品房再转让法律研究(1)论文
免费毕业论文--差速器壳体工艺及镗工装设计(一)
浅谈商事流质契约的概念及其意义(1)论文
谈现代化企业的ERP管理模式
关于商法几个基本理论问题的探讨(1)论文
计算机网络安全的分析
浅谈建立平等协商和集体合同制度的几点法律思考(1)论文
《看雪》(2篇)教案
《我不能失信》教案
《难忘的泼水节》教案
《欢庆》教案
《北京亮起来了》教案
《玩出了名堂》教案
《小柳树和小枣树》教案
《我们成功了》(1篇)教案
《找骆驼》教案
《一株紫丁香》(第一课时)教案
《秋天的图画》教案
《奇怪的大石头》教案
《一分钟》教案
《北京》教案
《葡萄沟》教案