CRC原理總結
CRC常用於判斷文件在傳輸過程中文件內容是否被更改以及其他的一些加密算法,在Java中,CRC32 工具類提供給我們使用。
1.CRC校驗具體原理如下:
在要發送的數據幀後面附加一個數(這個就是用來校驗的驗證碼,都為二進制序列),生成一個新幀發送給接受端。當然這個附加的數不能是隨意的,它要使所生成的新幀與
發送端和接收端共同選定某個數整除(註意:這裏不是使用的二進制除法,而是一種稱為:模2除法)。生成的新幀到達接收端後,再用這個新幀除以(同上)這個選定的數。
因為在發送之前就已經附加了一個數,做了”去余“處理。也就能夠整除了。所以結果應該沒有余數。如果有余數則表示在傳輸過程中出了差錯。
說明:
”模2除法“ 與算術除法類似,但它既不向上借位,也不比較除數與被除數的相同位數值大小,只要以相同位數進行相除就可以了。模2加法運算為:1+1=0;1+0=1;0+1=1;0+0=0
2.模2減法運算為:1-1=0;1-0=1;0-1=1;0-0=0。相當於二進制中邏輯異或運算(相同為1,不同為0)。如100101除以1110,結果得到商為11,余數為1.如11*11=101
3.CRC具體執行步驟:
1.先選擇一個用於在接收端進行校驗時,對接收的幀進行除法運算的除數
2.看所選擇的除數二進制數(假設k位),然後在要發送的數據幀(假設m位)後面加上k-1位”0“,然後以這個加了k-1個"0"的新幀(一共是m+k-1位)以”模2除法“方式除以上面這個除數,所得到的余數(也就是二進制字符串)就是該幀的CRC校驗碼,也稱為:FCS(幀校驗序列)。但一定要註意:余數的位數一定要是比除數位數只能少一位,哪怕前面一位是0,甚至全為0,也都不能省略。
3.再把這個校驗碼附在原數據幀(也就是m位的幀,註意不是在後面形成的m+k-1為的幀)後面,構建一個新幀發送給接收端。最後把這個接收端以”模2除法“方式除以前面選擇的除數,如果沒有了余數,則表明該幀在傳輸過程中沒有出現差錯。
4.總結
從上面可以看出:CRC有2個關鍵的點。一是要選擇一個發送端和接收端都用來作為除數的二進制比特串(或多項式)。二是用原始幀與上面選擇的進行二進制除法運算,計算出FCS。前者可以隨機選擇,也可以按照國際通用標準進行選擇,但最高為與最低為都必須為1,CRC16=X^16+X^15+X^2+X(對應二進制:11000000000000101)
5.案例
選擇CRC生成多項式G(X)=X^4+X^3+1,要求求出二進制序列10110011的CRC校驗碼。
參考:https://wenku.baidu.com/view/34ba49149b89680202d82513.htmlram=1
http://www.repairfaq.org/filipg/LINK/F_crc_v31.html
CRC原理總結