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