网站首页
IC库存
IC展台
电子资讯
技术资料
PDF文档
我的博客
IC72论坛
ic72 logo
资料首页最新产品 技术参数 电路图 设计应用 解决方案 代理商查询 IC替换 IC厂商 电子辞典
关键字: 技术文章 PDF资料 IC价格 电路图 代理商查询 IC替换 IC厂商 电子辞典

用C语言实现CRC校验计算

    摘  要:简述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值表

      注:16位CCITT多项式(X16 +X12 +X5 +1)和16位CRC16多项式(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)

    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计算的信息。

 

热门搜索:BTS410F2E6327 SBB1602-1 1553DBPCB PS361206 TLM609GF 6SPDX-15 PS-415-HG RS1215-RA SBBSM2120-1 PS480806 48VDCSPLITTER TLM825GF SS7415-15 PS120420 SBB2808-1 SBBSM2106-1 6NX-6 01T1001JF 02T5000JF 2920078 TLP1008TEL B30-7100-PCB TLP810NET PS-410-HGOEMCC SBB1605-1
COPYRIGHT:(1998-2010) IC72 达普IC芯片交易网
客户服务:service@IC72.com 库存上载:IC72@IC72.com
(北京)联系方式: 在线QQ咨询:点击这里给我发消息 联系电话:010-82614113 传真:010-82614123
京ICP备06008810号-21 京公网安备 11010802032910 号 企业资质