1. 程式人生 > >CRC校驗原理(cyclic redundancy check)

CRC校驗原理(cyclic redundancy check)

1、CRC基於“模二運算”。

模二運算類似於普通二進位制運算,但是區別在於無進位和借位。

例如:

加法:010+110=100

減法:010-110=100

無進位和借位使得模二運算的加減法相當於異或操作。

乘法:

     1010

*      101

————

     1010

   0000

 1010

————

 100010

除法:


看的出來,模二運算的乘除也和普通二進位制的乘除類似,唯一差別就是無進位借位(除法樣例中的餘數前面多的那個0可以不用管,看了下面就知道了)

2、CRC校驗流程

1)選定一個除數(術語叫生成多項式),假設這個除數二進位制為k位。

2)原碼左移k-1位得到一個新碼,比如原碼1001,k為4,那麼移位後就變成1001000。

3)新碼模二除以這個除數,得到一個k-1位的餘數(校驗碼)。如果餘數不滿k-1位,就手動在前面用0補滿,比如如果餘1,那就補成001。

4)把新碼加上這個校驗碼得到CRC碼,比如按以上樣例,最終的CRC碼就是1001001。

5)傳送

6)接收之後用這個CRC碼除以之前選擇的除數,餘數為0則傳輸沒有出錯。否則根據餘數和生成多項式的一些運算(書上寫的簡直一堆crap,看不懂),可以得到出錯位。

(圖片來自http://blog.csdn.net/lycb_gz/article/details/8201987