什么是 CRC 校驗?
CRC 即循環冗余校驗碼:是數據通信領域中最常用的一種查錯校驗碼,其特征是信息字段和校驗字段的長度可以任意選定。循環冗余檢查(CRC)是一種數據傳輸檢錯功能,對數據進行多項式計算,並將得到的結果附在幀的后面,接收設備也執行類似的算法,以保證數據傳輸的正確性和完整性。
CRC 校驗原理:
其根本思想就是先在要發送的幀后面附加一個數(這個就是用來校驗的校驗碼,但要注意,這里的數也是二進制序列的,下同),生成一個新幀發送給接收端。當然,這個附加的數不是隨意的,它要使所生成的新幀能與發送端和接收端共同選定的某個特定數整除(注意,這里不是直接采用二進制除法,而是采用一種稱之為“模2除法”)。到達接收端后,再把接收到的新幀除以(同樣采用“模2除法”)這個選定的除數。因為在發送端發送數據幀之前就已通過附加一個數,做了“去余”處理(也就已經能整除了),所以結果應該是沒有余數。如果有余數,則表明該幀在傳輸過程中出現了差錯。
模 2 除法:
模 2 除法與算術除法類似,但每一位除的結果不影響其它位,即不向上一位借位,所以實際上就是異或。在循環冗余校驗碼(CRC)的計算中有應用到模 2 除法。
例:
CRC 校驗步驟:
CRC 校驗中有兩個關鍵點,一是預先確定一個發送送端和接收端都用來作為除數的二進制比特串(或多項式),可以隨機選擇,也可以使用國際標准,但是最高位和最低位必須為 1;二是把原始幀與上面計算出的除數進行模 2 除法運算,計算出CRC碼。
具體步驟:
1. 選擇合適的除數
2. 看選定除數的二進制位數,然后在要發送的數據幀上面加上這個位數減 1 位的 0,然后用新生成的幀以模 2 除法的方式除上面的除數,得到的余數就是該幀的 CRC 校驗碼。注意,余數的位數一定只比除數位數少一位,也就是 CRC 校驗碼位數比除數位數少一位,如果前面位是 0 也不能省略。
3. 將計算出來的CRC校驗碼附加在原數據幀后面,構建成一個新的數據幀進行發送;最后接收端在以模 2 除法方式除以前面選擇的除數,如果沒有余數,則說明數據幀在傳輸的過程中沒有出錯。
CRC校驗碼計算示例:
現假設選擇的CRC生成多項式為 G(X) = X^4 + X^3 + 1,要求出二進制序列 10110011 的 CRC 校驗碼。下面是具體的計算過程:
①將多項式轉化為二進制序列,由 G(X) = X^4 + X^3 + 1 可知二進制一種有五位,第四位、第三位和第零位分別為 1,則序列為 11001
②多項式的位數位 5,則在數據幀的后面加上 5-1 位 0,數據幀變為 101100110000,然后使用模 2 除法除以除數 11001,得到余數。
③將計算出來的 CRC 校驗碼添加在原始幀的后面,真正的數據幀為 101100110100,再把這個數據幀發送到接收端。
④接收端收到數據幀后,用上面選定的除數,用模 2 除法除去,驗證余數是否為 0,如果為 0,則說明數據幀沒有出錯。
本篇文章轉載自:blog.csdn.net/D_leo/article/details/73572373,感謝博主。