• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > 用C語言實現CRC校驗計算

    用C語言實現CRC校驗計算

    作者: 時間:2012-05-22 來源:網絡 收藏

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

    首先介紹其原理,如果每次參與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_CRC160x

    001//反轉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】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語言相關文章:c語言教程




    關鍵詞: CRC 多項式 查表法

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 历史| 固安县| 宣汉县| 南靖县| 探索| 依安县| 靖宇县| 大田县| 阿拉善盟| 巴楚县| 古蔺县| 巴塘县| 泰顺县| 兴国县| 五寨县| 体育| 古田县| 亚东县| 揭阳市| 体育| 淮北市| 北辰区| 宁安市| 铜梁县| 连云港市| 仪征市| 罗定市| 怀宁县| 虹口区| 广汉市| 宝坻区| 陈巴尔虎旗| 东乡县| 蒙山县| 永年县| 红河县| 黄骅市| 定远县| 罗源县| 灵台县| 扶风县|