新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 用C語言實現(xiàn)CRC校驗計算

        用C語言實現(xiàn)CRC校驗計算

        作者: 時間:2012-05-22 來源:網(wǎng)絡(luò) 收藏

        在編寫數(shù)據(jù)傳輸程序時,數(shù)據(jù)容錯是一個非常重要的問題。循環(huán)冗余位校驗(CycliclRedundncyCheck英文簡稱)是目前運用非常廣泛的一種數(shù)據(jù)容錯方法,在數(shù)據(jù)傳輸,數(shù)據(jù)壓縮等領(lǐng)域運用極其廣泛。的實現(xiàn)分為硬件和軟件兩種方法,其中軟件實現(xiàn)的關(guān)鍵在于計算速度。如果單純模擬硬件實現(xiàn)方法,則計算速度較慢。筆者在編制一個數(shù)據(jù)通訊軟件中,運用了一種新穎的計算,速度很快,效果極佳。

        首先介紹其原理,如果每次參與CRC計算的信息為一個字節(jié),該信息字節(jié)加到16位的累加器中去時,只有累加器的高8位或低8位與信息字節(jié)相互作用(異或),相互作用(異或)的結(jié)果記為組合值,那么累加器中的新值等于組合值加上(按模2異或)累加器中未改變的那一半即為新的CRC值。

        組合值只有256種可能,因此可利用硬件模擬算法先算好它們的CRC值預(yù)先填入一張表中,該表的每一單元對應(yīng)相對值的CRC。這樣就可以通過來計算CRC值,以便大大提高CRC運算的速度。下面給出用C語言編制的計算程序。

        首先將CRC生成及CRC值表定義為一個頭文件CRC.H:

        #defineCRC_CCITT0x1021//CCITT

        #defineREV_CCITT0x8408//反轉(zhuǎn)CCITT

        #defineCRC160x8005//CRC16多項式

        #defineREV_CRC160x

        001//反轉(zhuǎn)CRC16多項式

        unsignedshortcrc_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"

        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】顧慰文,《糾錯碼及其在計算機系統(tǒng)中的應(yīng)用》,人民郵電出版社,1980。

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

        todetectndnddistinguishbetweenfiluresinlogiccircuits,IEEETrns.

        Electron.Comput.,EC- 16,No.5,pp.567-580(1977)

        【3】JoeCmpell:CProgrmmer'sGuidetoSerilCommuniction.(1988)

        c語言相關(guān)文章:c語言教程




        關(guān)鍵詞: CRC 多項式 查表法

        評論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 富蕴县| 张家港市| 天长市| 汪清县| 元阳县| 紫金县| 广灵县| 武汉市| 泸定县| 麻阳| 根河市| 菏泽市| 兴宁市| 醴陵市| 攀枝花市| 巩留县| 丰台区| 延庆县| 罗甸县| 高陵县| 河南省| 沭阳县| 兰坪| 清新县| 神农架林区| 天门市| 郎溪县| 琼结县| 湘潭县| 五寨县| 惠来县| 永和县| 濮阳市| 泽库县| 颍上县| 武冈市| 贵港市| 永宁县| 甘肃省| 屏东市| 灯塔市|