最好懂的CRC校驗規則講解

前言

  • CRC校驗的原理非常複雜,但是用起來卻很簡單,甚至別人寫好了函數,直接拿來調用即可,但是我們還是需要了解一點這個校驗碼是如何計算得來的
  • 網上的教程一大堆,但是很多講的太深入,讓人看的雲裏霧裏,不明所以,所以我纔想寫一個高中生都能看懂的,不那麼深入的,專注於應用的,通俗易懂的CRC校驗的解釋

何爲校驗

比如我寫了一封電子郵件給你,它是用二進制寫的,比如說是1010 1010

當你收到的時候,發現信息是1010 1011

很明顯最後一位被篡改了,但是你如何知道接收的信息是否有問題呢,這就需要校驗機制

使用校驗機制的結果,就是在要發送的數據之後,再接着發一串校驗碼

在串口通信中用的最多的就是奇偶校驗,所謂奇偶校驗,其實是兩種校驗方式,一種叫奇校驗,一種叫偶校驗,它們有什麼區別呢

  • 奇校驗:要發送的二進制數據中,計算1的個數,爲奇數則校驗碼爲1
  • 偶校驗:要發送的二進制數據中,計算1的個數,爲偶數則校驗碼爲1

如果剛剛我要發的電子郵件,採用偶校驗,那麼1010 1010中1的個數爲4,是偶數,所以最後校驗位是1,所以最終發送出去的數據是1010 1010 1

CRC校驗也是如此,它會在原始數據的末尾,再加上一串校驗位,這串校驗位是利用原始數據,通過固定的算法計算得到的,發送方和接收方,都遵循同樣的算法,如果傳輸過程無誤,接收方收到的信息沒有被篡改,則接收方可以利用這個算法,計算出校驗碼,再去跟發送方的校驗碼進行比較,相同的話則認爲接收的數據沒有問題(你可以這樣去理解,但是實際它不是這樣做的)

如何生成CRC校驗碼

還是上面的例子,要發送的信息爲1010 1010,十六進制爲0xAA

採用CRC-4/ITU校驗,校驗碼長度4位

在這裏插入圖片描述

可以看到得到的結果是1011,計算這個結果的過程很複雜,我先大致介紹怎麼得到這個結果,後面再詳細解釋計算過程

  • 先將1010 1010原始信息碼按字節位反轉,得到0101 0101
  • 將位反轉後的結果左移4位, 空出校驗碼的位置,得到0101 0101 0000
  • CRC-4/ITU的生成多項式是x^4 + x + 1,對應二進制是10011
  • 進行模二除法運算,被除數是0101 0101 0000,除數是10011,最終得到餘數1101
  • 將餘數進行按字節位反轉,得到1011,這就是最終校驗碼的結果

上面的過程可能不太好懂,所以我後面會詳細解釋

按字節位反轉

反轉其實很簡單,例如一段文字“張三李四王五”,反轉之後就是“五王四李三張”

一段二進制“1010 0111”,反轉過來就是“1110 0101”

至於按字節反轉,其實是考慮到如果要校驗的信息很長,有多個字節,例如“0101 1101 1010 1001”

它有兩個字節,就要在每個字節內做反轉,但是字節與字節之間的前後位置,是不變的

“0101 1101 1010 1001”按字節反轉後,得到“1011 1010 1001 0101”

確定左移多少位

左移的位數跟採用的CRC算法類型有關係,CRC校驗有很多種算法,下面舉幾個例子

名稱 生成多項式 數值式
CRC-4 x4+x+1 1 0010
CRC-8 x8 +x5+x4+1 1 0011 0001
CRC-12 x12+x11+x3+x2+x+1 1 1000 0000 1111
CRC-16 x16+x15+x2+1 1 1000 0000 0000 0101

其實生成多項式可以是多種多樣的,比如說CRC-8的生成多項式,其實並不是只有這一種,但是所有的生成多項式都要遵循一些基本的規定,具體怎麼規定,就不細說了,你確定了要採用哪種CRC校驗後,知道要去網上查表找它的生成多項式就行了

從表中可以看出,CRC-4,它的x4一定是存在的,同樣的,CRC-8,它是x8一定是存在的,這個數值4或者8,就是這種校驗方式最後生成校驗碼的位數

知道了校驗碼位數,就知道了需要左移多少位

生成多項式的數值式

以上的表中,還有一項是數值式,它是將多項式的係數提取出來,組成一串二進制的數
例如CRC-4

名稱 生成多項式 數值式
CRC-4 x^4 + x + 1 10011

生成多項式裏面,有很多項是係數0,如果把它寫完整,將會是

1 * x^4 + 0 * x^3 + 0 * x^2 + 1 * x ^1 + 1 * x^0

提取多項式的係數,得到10011

模二除法

所謂模二除法,本質上是異或運算,這裏用xor表示異或

0 xor 0 = 0
1 xor 1 = 0
1 xor 0 = 1
0 xor 1 = 1

發現異或運算的規律了嗎,相同則爲0,相異則爲1

下面來計算剛剛的例子,0101 0101 0000 模二除 10011

第一步先寫好被除數和除數
在這裏插入圖片描述

第二步,將除數寫到下面,進行異或運算
如果被除數的最高位爲0,那麼除數要放的位置,就要往右移,每次計算前,都要看被除數最高位是不是0,這步操作因爲最高位是1,所以除數放的位置右移了1位
進行異或運算,就是上下對應的每一位,都按異或進行計算,不需要考慮借位、進位等問題
這一步得到的結果是110,爲了做下一步運算,把被除數後面的位依次拿下來,得到11001
在這裏插入圖片描述

然後,重複第二步的操作,直到除盡,得到最終的餘數爲1101
在這裏插入圖片描述

將這個數按字節位反轉,得到1011,這便是最終的校驗碼

其它說明

在這裏插入圖片描述

在選擇一種CRC校驗方式之前,一定要知道它有哪些具體規定,例如CRC-4/ITU,它的輸入和輸出數據反轉,是被強制勾選的,所以計算的時候要格外注意

如果是做題,會發現很多規定,例如這個反轉,在題目裏面是沒有的,根本不需要做這個操作,所以自己一定要看清楚它的要求

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章