專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

C語(yǔ)言:CRC校驗(yàn)

作者:xuchen   來(lái)源:xuchen的blog   點(diǎn)擊數(shù):  更新時(shí)間:2014年05月28日   【字體:
一、CRC碼
CRC:Cylic Reduancy check譯作漢語(yǔ)就是循環(huán)冗余校驗(yàn)碼。

二、XOR
XOR:邏輯運(yùn)算符異或,不知道用符號(hào)怎么寫,總之其運(yùn)算法則是,不同為1,相同為0。

三、用XOR代替算術(shù)運(yùn)算上除法的兩個(gè)例子。
1、10110010000/11001
第一次異或(相除),得到商為1,余數(shù)為1111,加入下一位0,進(jìn)行
第二次異或,得到商為1,余數(shù)為111,加入下一位1,余數(shù)為1111,四位與除數(shù)5位不能夠異或計(jì)算,所以此處商為0,加入下一位0,進(jìn)行
第三次異或,得到商為1,余數(shù)為111,同理第5位商為0,余數(shù)繼續(xù)加入被除數(shù)的下一位0,進(jìn)行
第四次異或,得到商為1,余數(shù)為101,加入后一位被除數(shù)的0,得到商為0,最終余數(shù)為1010,而最終商為1101010。計(jì)算流程如下圖所示:

如若讓被除數(shù)10110010000加上余數(shù)1010則為10110011010,再除以(異或)11001,則得到余數(shù)為0000(此處不再具體計(jì)算).
2、1111000/1001
經(jīng)過(guò)三次異或(相除)得到商為1110,余數(shù)為110,具體例程如下,

同樣,讓該例的被除數(shù)1111000加上余數(shù)110后為1111110除以(異或)除數(shù)100則得到余數(shù)為000.

四、CRC校驗(yàn)原理
由以上兩個(gè)例子可以看出,通信過(guò)程中加入想要傳送的數(shù)據(jù)是“被除數(shù)”,加上余數(shù)后再傳送。而接收一方接收完整數(shù)據(jù)后,除以除數(shù),如果余數(shù)為0,則說(shuō)明傳送的數(shù)據(jù)正確,如果不為0則說(shuō)明傳送的數(shù)據(jù)有誤。因?yàn)閷?duì)于一個(gè)確定的“除數(shù)”,則就會(huì)有唯一的余數(shù)與之對(duì)應(yīng)。這個(gè)過(guò)程其實(shí)就是一個(gè)CRC的校驗(yàn)過(guò)程。不過(guò)名稱改一下不能叫做被除數(shù) 除數(shù)什么的。可以規(guī)定上述的除數(shù)叫做生成多項(xiàng)式或生成項(xiàng),用g(x)表示。而余數(shù)就叫做CRC校驗(yàn)碼。由以上知道,對(duì)于不同的生成項(xiàng),則就會(huì)有唯一的CRC校驗(yàn)碼與之對(duì)應(yīng)。而對(duì)于要傳送的數(shù)據(jù)也可以用一個(gè)系數(shù)僅為0和1取值的多項(xiàng)式一一對(duì)應(yīng)。例如代碼1010111對(duì)應(yīng)的多項(xiàng)式為x^6+x^4+x^2+x+1.而多項(xiàng)式x^5+x^3+x^2+x+1對(duì)應(yīng)的代碼是101111.
實(shí)際上,上述的被除數(shù)并不是真正的要傳送的數(shù)據(jù),真正要傳送的數(shù)據(jù)是一個(gè)多項(xiàng)式左移CRC校驗(yàn)碼位數(shù)后的代碼。定義CRC校驗(yàn)碼的位數(shù)表示它本身的寬度。
另外,關(guān)于生成項(xiàng),不難發(fā)現(xiàn)其最高位是1,實(shí)際上在除法的每次XOR時(shí)候都要被消掉,所以一般第一個(gè)1不做參考,后面的幾位才是最重要的。這就是為什么生成項(xiàng)的位數(shù)比CRC寬度大1的原因。且生成項(xiàng)的最后一位也必須同時(shí)為1.一般生成項(xiàng)簡(jiǎn)寫時(shí)候不寫最高位的1.以下是各種常用的生成項(xiàng)表達(dá)式:
CRC-4:x^4+x+1;-------------------------------->0x03
CRC-8:x^8+x^5+x^4+1;--------------------------->0x31
CRC-8:x^8+x^2+x^1+1;--------------------------->0x07
CRC-8:x^8+x^6+x^4+x^3+x^2+x;------------------->0x5E
CRC-12:x^12+x^11+x^4+x^3+x+1;------------------>0x80
CRC-16:x^16+x^15+x^2+1;------------------------>0x80005
CRC-16:x^16+x^12+x^5+1;------------------------>0x1021
CRC-32:x^32+x^26+x^23+....+x^2+x+1;------------>0x04C11DB7
CRC-32:x^32+x^28+x^27+....+x^8+x^6+1;---------->0x1EDC6F41

五、C語(yǔ)言的實(shí)現(xiàn)





附錄:

相關(guān)文章