- 相關(guān)推薦
用C語言實現(xiàn)CRC校驗計算
用C語言實現(xiàn)CRC校驗計算
<?xml:nmespce prefix = o ns ="urn:schems-microsoft-com:office:office" />Clcul
tes CRC quickly using the tble-lookup method
作 者:董云 YUN DONG
工作單位:黃埔海關(guān)技術(shù)處工程師
通訊地址:廣州市經(jīng)濟(jì)技術(shù)開發(fā)區(qū)志誠大道海關(guān)大樓
電話號碼:020-82130556
郵政編碼:510730
電子郵件: dy168@163.net
摘 要:
簡述CRC算法原理,給出一種新穎快速的查表計算方法,并給出用C語言編寫的算法源程序。關(guān)鍵詞:CRC
、多項式、查表法 在編寫數(shù)據(jù)傳輸程序時,數(shù)據(jù)容錯是一個非常重要的問題。循環(huán)冗余位校驗(Cyclicl Redundncy Check英文簡稱CRC)是目前運(yùn)用非常廣泛的一種數(shù)據(jù)容錯方法,在數(shù)據(jù)傳輸,數(shù)據(jù)壓縮等領(lǐng)域運(yùn)用極其廣泛。CRC的實現(xiàn)分為硬件和軟件兩種方法,其中軟件實現(xiàn)的關(guān)鍵在于計算速度。如果單純模擬硬件實現(xiàn)方法,則計算速度較慢。筆者在編制一個數(shù)據(jù)通訊軟件中,運(yùn)用了一種新穎的查表法計算CRC,速度很快,效果極佳。
首先介紹其原理,如果每次參與CRC計算的信息為一個字節(jié),該信息字節(jié)加到16位的累加器中去時,只有累加器的高8位或低8位與信息字節(jié)相互作用(異或),相互作用(異或)的結(jié)果記為組合值,那么累加器中的新值等于組合
值加上(按模2異或)累加器中未改變的那一半即為新的CRC值。
組合值只有256種可能,因此可利用硬件模擬算法先算好它們的CRC值預(yù)先填入一張表中,該表的每一單元對應(yīng)相對值的CRC。這樣就可以通過查表法來計算CRC值,以便大大提高CRC運(yùn)算的速度。下面給出用C語言編制的計算程序。
首先將CRC
生成多項式及CRC值表定義為一個頭文件CRC.H:
#define CRC_CCITT 0x1021 //CCITT多項式
#define REV_CCITT 0x8408 //反轉(zhuǎn)CCITT多項式
#define CRC16 0x8005 //CRC16
多項式
#define REV_CRC16 0x
001 //反轉(zhuǎn)CRC16多項式
unsigned short crc_tble[256]; //CRC值表
注:16位CCITT多項式(
X16 +X12 +X5 +1)和16位CRC16多項式(X16 +X15 +X2+1)為兩種最常用的CRC多項式。反轉(zhuǎn)多項式是指在數(shù)據(jù)通訊時,信息字節(jié)先傳送或接收低位字節(jié),如重新排位影響CRC計算速度,故設(shè)反轉(zhuǎn)多項式。
造表和查表法CRC計算函數(shù)。
#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語言實現(xiàn)CRC校驗計算】相關(guān)文章:
計算法簡單實現(xiàn)crc校驗08-06
CRC校驗實用程序庫08-06
C語言實現(xiàn)串行通信接口程序08-06
用Verilog HDL實現(xiàn)I2C總線功能08-06