教育资源为主的文档平台

当前位置: 查字典文档网> 所有文档分类> 论文> 其他论文> 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;

下载文档

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

网友最新关注

我家的猫
我的发现
从《乌塔》想到的8
观察日记——小金鱼
花花的故事
成长中的一件事
从《乌塔》想到的1
从《乌塔》想到的
秋天的流花湖公园
从《乌塔》想到的10
公园的一角
秋色花园
暑假郊外秋游
蝈蝈儿讲的故事
从《乌塔》想到的7
基于噪声检测的水轮机组故障诊断系
浅谈水土保持措施对水资源与水环境的影响
水泥土搅拌桩复合地基沉降计算探讨
白礤水库输水涵管除险加固处理方案
广东省水库淤积形势与防治方向
试论水利水电工程项目实施阶段工程造价管理
水利工程建设监理规定
水利水电主体结构工程监理实施细则
北江流域主要水利工程联合调度探讨
某水闸重建工程围堰的安全评估
河源市源城区七礤水库溢洪道消能试验研究
海堤和护岸消浪型式选择
水利工程专业认识实习报告
大型水利工程施工装备6项空白亟待技术支持
水电站工程基础处理监理实施细则
《祖父的园子》老师语录
《祖父的园子》教案设计 分析篇
《祖父的园子》同步作文训练素材
《把铁路修到拉萨去》美文欣赏二
《把铁路修到拉萨去》随堂练习 巩固篇
《把铁路修到拉萨去》美文欣赏
《把铁路修到拉萨去》考点练兵 文章阅读
《把铁路修到拉萨去》重点语句探究
《把铁路修到拉萨去》趣闻故事
《祖父的园子》重点字词意思
《把铁路修到拉萨去》重难点分析
《祖父的园子》同步作文写作指导 游记
《祖父的园子》重点字词梳理
《祖父的园子》重难点分析
《祖父的园子》教案设计 精解篇