CRC -- 循環冗餘校驗

CRC -- 循環冗餘校驗

循環冗餘校驗(英語:Cyclic redundancy check,通稱“CRC”)是一種根據網絡數據包或計算機文件等數據產生簡短固定位數校驗碼的一種散列函數,主要用來檢測或校驗數據傳輸或者保存後可能出現的錯誤。生成的數字在傳輸或者存儲之前計算出來並且附加到數據後面,然後接收方進行檢驗確定數據是否發生變化。一般來說,循環冗餘校驗的值都是32位的整數。由於本函數易於用二進制的計算機硬件使用、容易進行數學分析並且尤其善於檢測傳輸通道干擾引起的錯誤,因此獲得廣泛應用。

循環校驗碼(CRC碼):是數據通信領域中最常用的一種差錯校驗碼,其特徵是信息字段和校驗字段的長度可以任意選定。

生成CRC碼的基本原理:任意一個由二進制位串組成的代碼都可以和一個係數僅爲‘0’和‘1’取值的多項式一一對應。例如:代碼1010111對應的多項式爲x6+x4+x2+x+1,而多項式爲x5+x3+x2+x+1對應的代碼101111。

標準CRC生成多項式如下表:

名稱 生成多項式 簡記式* 標準引用
CRC-4 X4+X+1 3 ITU G.704
CRC-8 X8+X5+X4+1 0X31  
CRC-8 X8+X2+X1+1 0X07  
CRC-8 X8+X6+X4+X3+X2+X1 0X5E  
CRC-12 X12+X11+X3+X+1 80F  
CRC-16 X16+X15+X2+1 8005 IBM SDLC
CRC-16-CCITT X16+X12+X5+1 1021 ISO HDLC, ITU X.25, V.34/V.41/V.42, PPP-FCS
CRC-32 X32+X26+X23+...+X2+X+1 04C11DB7 ZIP, RAR, IEEE 802 LAN/FDDI, IEEE 1394, PPP-FCS
CRC-32c X32+X28+X27+...+X8+X6+1 1EDC6F41 SCTP

CRC-16校驗碼的使用

CRC-16最常用,現在說明它的使用方法:

根據Modbus協議,常規485通訊的信息發送形式如下:

地址 功能碼 數據信息 校驗碼
1 byte 1 byte n byte 2 byte

CRC校驗是前面幾段數據內容的校驗值,爲一個16位數據,發送時,低8位在前,高8爲最後。

例如:信息字段代碼爲: 1011001,校驗字段爲:1010。

發送方:發出的傳輸字段爲: 1 0 1 1 0 0 1 1 0 10

接收方:使用相同的計算方法計算出信息字段的校驗碼,對比接收到的實際校驗碼,如果相等即信息正確,不相等則信息錯誤;或者將接受到的所有信息除多項式,如果能夠除盡,則信息正確。

CRC-16校驗碼計算方法

常用查表法和計算法。計算方法一般都是:
(1)、預置1個16位的寄存器爲十六進制FFFF(即全爲1),稱此寄存器爲CRC寄存器;
(2)、把第一個8位二進制數據(既通訊信息幀的第一個字節)與16位的CRC寄存器的低
       8位相異或,把結果放於CRC寄存器,高八位數據不變;
(3)、把CRC寄存器的內容右移一位(朝低位)用0填補最高位,並檢查右移後的移出位;
(4)、如果移出位爲0:重複第3步(再次右移一位);如果移出位爲1,CRC寄存器與多

    項式A001(1010 0000 0000 0001)進行異或;
(5)、重複步驟3和4,直到右移8次,這樣整個8位數據全部進行了處理;
(6)、重複步驟2到步驟5,進行通訊信息幀下一個字節的處理;
(7)、將該通訊信息幀所有字節按上述步驟計算完成後,得到的16位CRC寄存器的高、低
       字節進行交換;
(8)、最後得到的CRC寄存器內容即爲:CRC碼。

以上計算步驟中的多項式A001是8005按位顛倒後的結果。

查表法是將移位異或的計算結果做成了一個表,就是將0~256放入一個長度爲16位的寄存器中的低八位,高八位填充0,然後將該寄存器與多項式0XA001按照上述3、4步驟,直到八位全部移出,最後寄存器中的值就是表格中的數據,高八位、低八位分別單獨一個表。

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