資源描述:
《crc校驗原理分析》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、CRC校驗校驗原理:K循環(huán)校驗碼(CRC碼):是數(shù)據(jù)通信領(lǐng)域屮最常用的一種差錯校驗碼,其特征是信息字段和校驗字段的長度可以任意選定。2、生成CRC碼的基本原理:任意一個由二進(jìn)制位串組成的代碼都可以和一個系數(shù)僅為’(T和'1,取值的多項式一一對應(yīng)。例如:代碼1010111對應(yīng)的多項式為x6+x4+x2+x+l,而多項式為x5+x3+x2+x+l對應(yīng)的代碼lOllllo3、CRC碼集選擇的原則:若設(shè)碼字長度為N,信息字段為K位,校驗字段為R位(N二K+R),則對于CRC碼集中的任一碼字,存在且僅存在一個R次多項式g(x),使得V(x)=A(x)g(x)=xRm(x)+r(x);其中:m(x
2、)為K次信息多項式,r(x)為R-1次校驗多項式,g(x)稱為生成多項式:g(x)=go+gix+g2x2+...+g(R-i>x(R_1>+gRxR發(fā)送方通過指定的g(x)產(chǎn)生CRC碼字,接收方則通過該g(x)來驗證收到的CRC碼字。4、CRC校驗碼軟件生成方法:借助于多項式除法,其余數(shù)為校驗字段。例如:信息字段代碼為:1011001;對應(yīng)m(x)=x6+x4+x3+l假設(shè)生成多項式為:g(x)=xW+l;則對應(yīng)g(x)的代碼為:11001xm(x)=xIO+xs+x7+x4對應(yīng)的代碼記為:10110010000;發(fā)送方:發(fā)岀的傳輸字段為:10110011010信息字段校驗字段接收方
3、:使用相同的生成碼進(jìn)行校驗:接收到的字段/生成碼(二進(jìn)制除法)如果能夠除盡,則止確,CRC校驗源碼分析這兩天做項目,需要用到CRC校驗。以前沒搞過這東東,以為挺簡單的。結(jié)果看看別人提供的匯編源程序,屆然看不懂。花了兩天時間研究了一下CRC校驗,希槊我寫的這點東西能夠幫助和我有同樣困惑的朋友節(jié)省點時間。先是在網(wǎng)上下了一堆亂七八遭的資料下來,感覺都是一個模樣,全都是從CRC的數(shù)學(xué)原理開始,一長串的表達(dá)式看的我頭暈。第一次接觸還真難以理解。這些東西不想在這里講,隨便找一下都是一大把。我想根據(jù)源代碼來分析會比較好懂一些。費了老大功夫,才搞清楚CRC根據(jù)”權(quán)”(即多項表達(dá)式)的不同而相應(yīng)的源代碼
4、也有稍許不同。以下是各種常用的權(quán)。CRC8=X8+X5+X4+1CROCQTT=X16+X12+X5+1CRC16=X16+X15+X5+1CRC12=X12+X11+X3+X2+1CRC32=X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+1以下的源程序全部以COTT為例。其實本質(zhì)都是一樣,搞明白一種,其他的都是小菜。圖1,圖2說明了CRC校驗中CRC值是如何計算出來的,體現(xiàn)的多項式正是X16+X12+X5+1。SerialData即是需要校驗的數(shù)據(jù)。從把數(shù)據(jù)移位開始計算,將數(shù)據(jù)位(從最低的數(shù)據(jù)位開始)逐位移入反向耦合移位寄存器(這
5、個名詞我也不懂,覺得蠻酷的,就這樣寫了,嘿)。當(dāng)所有數(shù)據(jù)位都這樣操作后,計算結(jié)束。此時,16位移位寄存器中的內(nèi)容就是CRC碼。LSB圖1生成CRC?CC1TT的移位寄存器的作用原理
6、cla~
7、cLk~rcii
8、cik1
9、cik~nnk■—
10、dk~
11、cii~~「d~~i
12、』"-k平bgudohK)h_cpjkjnbgk.dop_dckKfl圧JL圖2用于計算CRC_CC1T1、的移位寄心器的電路配置圖中進(jìn)行XOR運算的位與多項式的表達(dá)相對應(yīng)。X5代表Bit5,X12代表Bit12,1自然是代表BitO,X16比較特別,是指移位寄存器移出的數(shù)據(jù),即圖中的DATAOUT.可以這樣理解,與數(shù)據(jù)
13、位做XOR運算的是上次CRC值的Bit15。根據(jù)以上說明,可以依葫蘆畫瓢的寫出以下程序。(程序都是在keilC7.10下調(diào)試的)typedefunsignedcharuchar;typedefunsignedintuint;codeucharcrcbuff[]={0x00,0x00,0x00,0x00,0x06,0x0d,0xd2,0xe3};uintcrc;//CRC碼voidmain(void){uchar*ptr;crc=0;//CRC初值ptr=crcbuff;//指向第一個Byte數(shù)據(jù)crc=crc16l(ptr,8);while(1);uintcrc16l(uchar*pt
14、r,ucharlen)//ptr為數(shù)據(jù)指針,len為數(shù)據(jù)長度{uchari;while(len-){for(i=0x80;i!=0;i>>=1){if((crc&0x8000)!=0){crc<<=1;crcA=0x1021;}1-1elsecrc<<=1:1-2if((*ptr&i)!=0)crcA=0x1021;1-3}ptr++;}return(crc);}執(zhí)行結(jié)果crc=OxdbcO;程序1-1,1-2,1-3可以理解成移位前crc的B