现在位置:范文先生网>理工论文>计算机信息技术>用C语言实现CRC校验计算

用C语言实现CRC校验计算

时间:2023-02-21 00:09:27 计算机信息技术 我要投稿
  • 相关推荐

用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,速度很快,效果极佳。

  首先介绍其原理,如果每次参与CRC计算的信息为一个字节,该信息字节加到16位的累加器中去时,只有累加器的高8位或低8位与信息字节相互作用(异或),相互作用(异或)的结果记为组合值,那么累加器中的新值等于组合

值加上(按模2异或)累加器中未改变的那一半即为新的CRC值。

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

  首先将CRC

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

  #define CRC_CCITT 0x1021  //CCITT多项式

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

    #define CRC16 0x8005      //CRC16

多项式

    #define REV_CRC16 0x

001  //反转CRC16多项式

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

注:16CCITT多项式(

X16 +X12 +X5 +1)和16CRC16多项式(X16 +X15 +X2+1)为两种最常用的CRC多项式。反转多项式是指在数据通讯时,信息字节先传送或接收低位字节,如重新排位影响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)

        &

nbsp;

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

]; 

【用C语言实现CRC校验计算】相关文章:

计算法简单实现crc校验08-06

用C语言实现按钮新技术08-06

CRC校验实用程序库08-06

C语言实现串行通信接口程序08-06

用汇编语言实现BCH解码校验算法08-06

AVR单片机CRC校验码的查表与直接生成08-06

用Verilog HDL实现I2C总线功能08-06

用TMS320C54X实现Vertibi译码器08-06

用P89C664实现I2C总线大批量数据的自动存储08-06