网卡厂家
免费服务热线

Free service

hotline

010-00000000
网卡厂家
热门搜索:
行业资讯
当前位置:首页 > 行业资讯

用C语言实现CRC校验计算

发布时间:2020-07-21 17:21:01 阅读: 来源:网卡厂家

在编写数据传输程序时,数据容错是一个非常重要的问题。循环冗余位校验(CycliclRedundncyCheck英文简称CRC)是目前运用非常广泛的一种数据容错方法,在数据传输,数据压缩等领域运用极其广泛。CRC的实现分为硬件和软件两种方法,其中软件实现的关键在于计算速度。如果单纯模拟硬件实现方法,则计算速度较慢。笔者在编制一个数据通讯软件中,运用了一种新颖的查表法计算CRC,速度很快,效果极佳。 首先介绍其原理,如果每次参与CRC计算的信息为一个字节,该信息字节加到16位的累加器中去时,只有累加器的高8位或低8位与信息字节相互作用(异或),相互作用(异或)的结果记为组合值,那么累加器中的新值等于组合值加上(按模2异或)累加器中未改变的那一半即为新的CRC值。 组合值只有256种可能,因此可利用硬件模拟算法先算好它们的CRC值预先填入一张表中,该表的每一单元对应相对值的CRC。这样就可以通过查表法来计算CRC值,以便大大提高CRC运算的速度。下面给出用C语言编制的计算程序。 首先将CRC生成多项式及CRC值表定义为一个头文件CRC.H:#defineCRC_CCITT0x1021//CCITT多项式 #defineREV_CCITT0x8408//反转CCITT多项式 #defineCRC160x8005//CRC16多项式 #defineREV_CRC160x001//反转CRC16多项式unsignedshortcrc_tble[256];//CRC值表 注:16位CCITT多项式(X16+X12+X5+1)和16位CRC16多项式(X16+X15+X2+1)为两种最常用的CRC多项式。反转多项式是指在数据通讯时,信息字节先传送或接收低位字节,如重新排位影响CRC计算速度,故设反转多项式。 造表和查表法CRC计算函数。 #include"crc.h" voidmk_crctble(unsignedshortgenpoly) unsignedshortcrc_tble[256]; unsignedshort ccnum=0; unsignedshorti,j,k; for(i=0,k=0;i256;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; voidcrc_upd te(unsignedshortd t ,unsignedshort ccnum) ccnum=( ccnum=8)^crc_tble[( ccnum>>8)^d t]; 注:genpoly为CRC多项式, ccnum为累加器值(即为新的CRC值),d t 为参与CRC计算的信息。 参考文献: 【1】顾慰文,《纠错码及其在计算机系统中的应用》,人民邮电出版社,1980。 【2】th,uricius:Progrmmedlgorithmstocomputetests

todetectndnddistinguishbetweenfiluresinlogiccircuits,IEEETrns.

put.,EC- 16,No.5,pp.567-580(1977) 【3】JoeCmpell:CProgrmmer'sGuidetoSerilCommuniction.(1988)

c语言相关文章:c语言教程

07 MySQL 创建数据库

Wiki宝典

递归算法之斐波那契数列