查字典论文网 >> 用C语言实现CRC校验计算

用C语言实现CRC校验计算

小编:

用C语言实现CRC校验计算 用C语言实现CRC校验计算 信息技术论文 更新:2006-4-8 阅读: 用C语言实现CRC校验计算

用C语言实现CRC校验计算

<?xml:nmespce prefix = o ns ="urn:schems-microsoft-com:office:office" />Clcul

tes CRC quickly using the tble-lookup method

作 者:董云 YUN DONG

工作单位:黄埔海关技术处工程师

通讯地址:广州市经济技术开发区志诚大道海关大楼

电话号码:020-82130556

邮政编码:510730

电子邮件: dy168@163.net

要:

简述CRC算法原理,给出一种新颖快速的查表计算方法,并给出用C语言编写的算法源程序。关键词:CRC、多项式、查表法 在编写数据传输程序时,数据容错是一个非常重要的问题。循环冗余位校验(Cyclicl Redundncy Check英文简称CRC)是目前运用非常广泛的一种数据容错方法,在数据传输,数据压缩等领域运用极其广泛。CRC的实现分为硬件和软件两种方法,其中软件实现的关键在于计算速度。如果单纯模拟硬件实现方法,则计算速度较慢。笔者在编制一个数据通讯软件中,运用了一种新颖的查表法计算CRC,速度很快,效果极佳。

组合值只有256种可能,因此可利用硬件模拟算法先算好它们的CRC值预先填入一张表中,该表的每一单元对应相对值的CRC。这样就可以通过查表法来计算CRC值,以便大大提高CRC运算的速度。下面给出用C语言编制的计算程序。

首先将CRC生成多项式及CRC值表定义为一个头文件CRC.H:

#define REV_CCITT 0x8408 //反转CCITT多项式

#define CRC16 0x8005 //CRC16多项式

#define REV_CRC16 0x

001 //反转CRC16多项式

unsigned short crc_tble[256]; //CRC值表

造表和查表法CRC计算函数。

#include "crc.h"

void mk_crctble(unsigned short genpoly)

unsigned short crc_tble[256];

unsigned short

ccnum=0;

unsigned short i,j,k;

for(i=0,k=0;i<256;i++,k++)

i<<=8;

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

if((i^ccnum)&0x8000)

ccnum=(

ccnum<<=

1)^genpoly;

else

ccnum<<=1;

i<<=1;

crc_tble[k]=

ccnum;

void crc_upd

te(unsigned short d

t

,unsigned short

ccnum)

ccnum=(

ccnum<<=

8)^crc_tble[(

ccnum>>

8)^d

t

];

注:genpoly为CRC多项式,

ccnum为累加器值(即为新的CRC值),d

t

为参与CRC计算的信息。

参考文献:

【1】顾慰文,《纠错码及其在计算机系统中的应用》,人民邮电出版社,1980。

【2】J.P.Roth,W.G.Bouricius: Progrmmed

热点推荐