日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(转)CRC校验算法详解

發(fā)布時間:2023/12/31 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (转)CRC校验算法详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

CRC(Cyclic Redundancy Check)循環(huán)冗余校驗是常用的數(shù)據(jù)校驗方法,講CRC算法的文章很多,之所以還要寫這篇,是想換一個方法介紹CRC算法,希望能讓大家更容易理解CRC算法。
  先說說什么是數(shù)據(jù)校驗。數(shù)據(jù)在傳輸過程(比如通過網(wǎng)線在兩臺計算機間傳文件)中,由于傳輸信道的原因,可能會有誤碼現(xiàn)象(比如說發(fā)送數(shù)字5但接收方收到的卻是6),如何發(fā)現(xiàn)誤碼呢?方法是發(fā)送額外的數(shù)據(jù)讓接收方校驗是否正確,這就是數(shù)據(jù)校驗。最容易想到的校驗方法是和校驗,就是將傳送的數(shù)據(jù)(按字節(jié)方式)加起來計算出數(shù)據(jù)的總和,并將總和傳給接收方,接收方收到數(shù)據(jù)后也計算總和,并與收到的總和比較看是否相同。如果傳輸中出現(xiàn)誤碼,那么總和一般不會相同,從而知道有誤碼產(chǎn)生,可以讓發(fā)送方再發(fā)送一遍數(shù)據(jù)。  
  CRC校驗也是添加額外數(shù)據(jù)做為校驗碼,這就是CRC校驗碼,那么CRC校驗碼是如何得到的呢?  
  非常簡單,CRC校驗碼就是將數(shù)據(jù)除以某個固定的數(shù)(比如ANSI-CRC16中,這個數(shù)是0x18005),所得到的余數(shù)就是CRC校驗碼。  
  那這里就有一個問題,我們傳送的是一串字節(jié)數(shù)據(jù),而不是一個數(shù)據(jù),怎么將一串?dāng)?shù)字變成一個數(shù)據(jù)呢?這也很簡單,比如說2個字節(jié)B1,B2,那么對應(yīng)的數(shù)就是(B1<<8)+B2;如果是3個字節(jié)B1,B2,B3,那么對應(yīng)的數(shù)就是((B1<<16)+(B2<<8)+B3),比如數(shù)字是0x01,0x02,0x03,那么對應(yīng)的數(shù)字就是0x10203;依次類推。如果字節(jié)數(shù)很多,那么對應(yīng)的數(shù)就非常非常大,不過幸好CRC只需要得到余數(shù),而不需要得到商。  
  從上面介紹的原理我們可以大致知道CRC校驗的準確率,在CRC8中出現(xiàn)了誤碼但沒發(fā)現(xiàn)的概率是1/256,CRC16的概率是1/65536,而CRC32的概率則是1/2^32,那已經(jīng)是非常小了,所以一般在數(shù)據(jù)不多的情況下用CRC16校驗就可以了,而在整個文件的校驗中一般用CRC32校驗。  
  這里還有個問題,如果被除數(shù)比除數(shù)小,那么余數(shù)就是被除數(shù)本身,比如說只要傳一個字節(jié),那么它的CRC就是它自己,為避免這種情況,在做除法之前先將它移位,使它大于除數(shù),那么移多少位呢?這就與所選的固定除數(shù)有關(guān)了,左移位數(shù)比除數(shù)的位數(shù)少1,下面是常用標準中的除數(shù):  
  CRC8:多項式是X8+X5+X4+1,對應(yīng)的數(shù)字是0x131,左移8位  
  CRC12:多項式是X12+X11+X3+X2+1,對應(yīng)的數(shù)字是0x180D,左移12位  CCITT
  CRC16:多項式是X16+X12+X5+1,對應(yīng)的數(shù)字是0x11021,左移16位  ANSI
  CRC16:多項式是X16+X15+X2+1,對應(yīng)的數(shù)字是0x18005,左移16位  
  CRC32:多項式是X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+1,對應(yīng)數(shù)字是0x104C11DB7,左移32  
  因此,在得到字節(jié)串對應(yīng)的數(shù)字后,再將數(shù)字左移M位(比如ANSI-CRC16是左移16位),就得到了被除數(shù)。  
  好了,現(xiàn)在被除數(shù)和除數(shù)都有了,那么就要開始做除法求CRC校驗碼了。CRC除法的計算過程與我們筆算除法類似,首先是被除數(shù)與除數(shù)高位對齊后,被除數(shù)減去除數(shù),得到了差,除數(shù)再與差的最高位對齊,進行減法,然后再對齊再減,直到差比除數(shù)小,這個差就是余數(shù)。
  不過和普通減法有差別的是,CRC的加(減)法是不進(借)位的,比如10減01,它的結(jié)果是11,而不是借位減法得到的01,因此,實際上CRC的加法和減法所得的結(jié)果是一樣的,比如10加01的結(jié)果是11,10減01的結(jié)果也是11,這其實就是異或操作。
  代碼:略。
  原文鏈接:
  https://www.cnblogs.com/wchonline/p/11698677.html

總結(jié)

以上是生活随笔為你收集整理的(转)CRC校验算法详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。