CRC:Cylic Reduancy check譯作漢語就是循環冗余校驗碼。
二、XOR
XOR:邏輯運算符異或,不知道用符號怎么寫,總之其運算法則是,不同為1,相同為0。
三、用XOR代替算術運算上除法的兩個例子。
1、10110010000/11001
第一次異或(相除),得到商為1,余數為1111,加入下一位0,進行
第二次異或,得到商為1,余數為111,加入下一位1,余數為1111,四位與除數5位不能夠異或計算,所以此處商為0,加入下一位0,進行
第三次異或,得到商為1,余數為111,同理第5位商為0,余數繼續加入被除數的下一位0,進行
第四次異或,得到商為1,余數為101,加入后一位被除數的0,得到商為0,最終余數為1010,而最終商為1101010。計算流程如下圖所示:
2、1111000/1001
經過三次異或(相除)得到商為1110,余數為110,具體例程如下,
四、CRC校驗原理
由以上兩個例子可以看出,通信過程中加入想要傳送的數據是“被除數”,加上余數后再傳送。而接收一方接收完整數據后,除以除數,如果余數為0,則說明傳送的數據正確,如果不為0則說明傳送的數據有誤。因為對于一個確定的“除數”,則就會有唯一的余數與之對應。這個過程其實就是一個CRC的校驗過程。不過名稱改一下不能叫做被除數
除數什么的。可以規定上述的除數叫做生成多項式或生成項,用g(x)表示。而余數就叫做CRC校驗碼。由以上知道,對于不同的生成項,則就會有唯一的CRC校驗碼與之對應。而對于要傳送的數據也可以用一個系數僅為0和1取值的多項式一一對應。例如代碼1010111對應的多項式為x^6+x^4+x^2+x+1.而多項式x^5+x^3+x^2+x+1對應的代碼是101111.
實際上,上述的被除數并不是真正的要傳送的數據,真正要傳送的數據是一個多項式左移CRC校驗碼位數后的代碼。定義CRC校驗碼的位數表示它本身的寬度。
另外,關于生成項,不難發現其最高位是1,實際上在除法的每次XOR時候都要被消掉,所以一般第一個1不做參考,后面的幾位才是最重要的。這就是為什么生成項的位數比CRC寬度大1的原因。且生成項的最后一位也必須同時為1.一般生成項簡寫時候不寫最高位的1.以下是各種常用的生成項表達式:
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語言的實現
附錄:
【關閉窗口】
上一篇:C語言:指針函數和函數指針
下一篇:C語言:結構體與結構體指針