CRC也就是循環冗余校驗碼,是計算機網絡通信領域常用的校驗碼。循環冗余校驗碼包括一系列移位、相除等數據編碼規則,其算法原理、算法程序的設計與分析,都可以通過相應的軟件編碼進行解決。
循環冗余校驗碼是利用軟件進行校驗的算法,因此其檢驗速度很快,校驗的誤碼率也較低,整個計算機網絡通信的信息傳輸速度很高。CRC差錯糾正控制法能夠有效減少通信線路的誤碼率,得到的通信數據傳輸信息更準確。
在數據的傳輸過程中由于空間電磁環境復雜等原因,可能會產生誤碼,即某幾位數據0變為1,或1變為0,導致接收端得到錯誤的數據。為了降低誤碼率,通常對數據進行特定編碼,在收發端進行額外的驗證,使接收端能發現某些錯誤;
進而實現糾錯功能,常用的編碼方法有CRC-校驗碼、CRC-校驗碼、漢明碼、奇偶校驗法等。其中位循環冗余校驗簡稱CRC-校驗在性能和資源消耗兩方面都有較大的優勢,因而,在無線電通信、SATA硬盤數據傳輸等系統中,CRC-校驗是最常用的檢錯手段之一。
CRC叫做循環冗余校驗,是檢驗發送數據是否正確的一種方法。比如你發過來的是0x這個數據,要是發送過程中出現了干擾,變成了其他數據比如0x,這樣送到設備上會出問題的。所以MODBUS利用了一種方法,就是把每一個BYTE的數據和一個固定值(位數值)進行一次運算(循環的,比如上面的數據中運算完結果用在上運算,再往下以此類推),最后得到一個2BYTE的數值(位)。也就是經過這一系列的運算,發送方和接收方算出來的CRC數值應該相同的;如果傳送中數據的某一位或者某幾位出現了問題,那么運算出來的結果就會不一樣(并不是%,但是已經很高了),那么這個數據就不能要了。懂了嗎?
檢測數據傳輸保存后出現的錯誤。循環冗余檢查是一種根據數據產生簡短固定位數校驗碼的散列函數,主要用于檢測或校驗數據傳輸或者保存后出現的錯誤,生成的數字在傳輸或者存儲之前計算出來并附加到數據后面,然后接收方進行檢驗確定數據是否發生變化,循環冗余校驗的值都是位的整數,由于該函數易于用二進制的計算機硬件使用,容易進行數學分析,并尤其善于檢測傳輸通道干擾引起的錯誤,因此獲得廣泛應用。
循環冗余碼CRC(Cyclic Redundancy Code)又稱多項式碼.
任何一個由二進制數位串組成的代碼,都可以惟一地與一個只含有0和1兩個系數的多項式建立一一對應的關系.例如,代碼對應的多項式為X6+X4+X2+X+1,多項式X5+X3+X2+X+1對應的代碼為.
CRC碼在發送端編碼和接收端檢驗時,都可以利用事先約定的生成多項式G(X)來得到.設G(X)中最高位X的次方為Xr,信息位為K(X);則CRC碼=Xr乘以K(X)再除以G(X).
比如:信息位K(X)=X6+X4+X3+1既,生成多項式G(X)=既X4+X3+1(可得Xr=X4)
則CRC碼=X4* (X6+X4+X3+1)/(X4+X3+1)=X+X8+X7+X4/(X4+X3+1)=/
得到的余數就是CRC碼
注:以上除法用的是模2除法,是一種不考慮減法借位的運算.既0-0=0,0-1=1,1-0=1,1-1=0
—————————————————————————————
重新在網站做了圖解,有疑問的話直接在網站留言吧
CRC循環校驗是什么
CRC是什么東西呢?其實我們大家都不應該會對它陌生,回憶一下?你用過RAR和ZIP等壓縮軟件嗎?它們是不是常常會給你一個惱人的“CRC校驗錯誤”信息呢?我想你應該明白了吧,CRC就是塊數據的計算值,它的全稱是“Cyclic Redundancy Check”,中文名是“循環冗余碼”,“CRC校驗”就是“循環冗余校驗”。(哇,真拗口,希望大家不要當我是唐僧,呵呵。^_^)
CRC有什么用呢?它的應用范圍很廣泛,最常見的就是在網絡傳輸中進行信息的校對。其實我們大可以把它應用到軟件保護中去,因為它的計算是非常非常非常嚴格的。嚴格到什么程度呢?你的程序只要被改動了一個字節(甚至只是大小寫的改動),它的值就會跟原來的不同。Hoho,是不是很厲害呢?所以只要給你的“原”程序計算好CRC值,儲存在某個地方,然后在程序中隨機地再對文件進行CRC校驗,接著跟第一次生成并保存好的CRC值進行比較,如果相等的話就說明你的程序沒有被修改/破解過,如果不等的話,那么很可能你的程序遭到了病毒的感染,或者被Cracker用進制工具暴力破解過了。
參考資料:矛與盾的較量(2)——CRC原理篇%%老羅的繽紛天地.htm