CRC校验算法学习
?
原文:http://www.repairfaq.org/filipg/LINK/F_crc_v31.html
本文根據上述鏈接原文翻譯而來,如有錯誤,忘廣大網友互相幫忙糾正,謝謝!
?
1、前言:
1.0 作者
- 作者:Ross N. Williams
- 電子郵件ross@guest.adelaide.edu.au
- 日期:1993年8月19日
- 版本:3
1.1 代碼示例
crcmodel.h? crctable.c crcmodel.c?
1.2 摘要
?
2、簡介:錯誤校驗
錯誤校驗的目的是通過檢驗傳輸信號中的噪音干擾(出錯的源頭),以檢驗傳輸數據是否出錯。
為此,從有效的數據構建一個校驗值(稱之為校驗和),包含在傳輸數據流中,作為檢驗數據是否完備。
接收方使用同樣的計算方法對信息數據進行求校驗值,和數據中的校驗值比較,以確定數據是否正確無誤。
?
例如,我們通過將信息數據采用和校驗方法(33 =(6+23+4)%256),對下列數據進行校驗?:
原始信息數據:6, 23, 4
帶校驗和的數據:6, 23, 4, 33
實際接收的數據:6, 27, 4, 33
我們將接收的數據 { 6, 27, 4 } 進行和校驗((6+27+4)%256 = 37),結果與接收的校驗碼 33 進行比較,校驗碼不一致,說明接收的數據出錯已經損壞。
還有一種更危險的情況就是,當信息數據和校驗數據同時被損壞,而導致校驗一致的情況。這種情況不可避免,最有效的辦法就是增加校驗和中的信息量(例如將一個字節校驗增加到兩個),來減小這種情況發生的概率。
?
存在其它的錯誤校驗計時,這些技術對信息數據進行比較復雜的轉換,從而注入更多的冗余信息,
本文僅僅介紹?CRC 校驗算法,它屬于錯誤校驗算法的一種類型。
CRC校驗通過在數據末尾附加校驗碼的形式保證數據的完整性。
?
3.復雜性的需要
在上一節和校驗示例中,我們通過和校驗的方法檢測數據損壞,通過求和再求模256的形式求得校驗碼。
原始信息數據:6, 23, 4
帶校驗和的數據:6, 23, 4, 33
實際接收的數據:6, 27, 4, 33
和校驗的的這種方法太過于簡單,如果信號數據出錯,我們仍然有1/256概率檢測不到錯誤,例如:
原始信息數據:6, 23, 4
帶校驗和的數據:6, 23, 4, 33
實際接收的數據:8, 20, 5, 33
為了加強校驗和,我們把校驗碼從一個8bit寄存器擴展到16bit寄存器(即 65536,而非 mod 256),從而明顯將出錯概率由 1/256 降低至 1/65536。
擴充校驗碼位數雖然這是個好辦法,單這種方法是比較失敗的,因為所使用的計算方法不夠“隨機”。
簡單的求和校驗方法,使得每個字節的數據都可以影響到校驗碼對應字節的結果,與擴充校驗碼數據位數無關。?
只有使用更加復雜算法替換簡單求和算法,才能減小每個信息數據對校驗碼的影響,才能解決這個問題。
?
總結下,我們看到需要下面兩個方面才能形成比較強的校驗函數:
數據寬度:寬的數據寬度可以保證更低的出錯概率,例如32bit數據給出 1/2^32 的出錯概率機會。
混亂隨機:使得每個輸入字節具備改變校驗碼寄存器任意位數的可能性。?
?
注意:術語?"checksum" ,即校驗和,早期用來描述邱丹求和公式,單現在包含更廣泛含義,包含更復雜的算法,如 CRC算法 。
?
4. CRC 算法的基本思想
構建復雜的校驗碼計算方法有很多種方式。
我們看到使用加法的“校驗和”算法不夠強大,無法形成有效的校驗碼。
但研究結果表明使用除法可以,要使用和校驗碼寄存器一樣寬的大除數就可以。
?
CRC算法的基本思想是把 信息數據當做一個很大的二進制數來處理,用它除以一個固定的二進制數,并將這個除法的余數作為校驗碼。
接收到信息數據后,接收方執行相同的除法,并將 余數 與 校驗碼 進行比較來驗證信息數據是否完整。
?
例如:
假定信息數據包含2個字節{ 6, 23 } , 則可以認為是二進制數 0000-0110-0001-0111。
假設使用1個字節校驗寬度,使用常數除數位 1001,則校驗碼為的余數?0000-0110-0001-0111 除以1001。
我們用所學過的除法就可以求得余數。計算過程如下
...0000010101101 = 00AD = 173 = 商____-___-___-___- 9= 1001 ) 0000011000010111 = 0617 = 1559 = 除數 被除數 0000.,,....,.,,,----.,,....,.,,,0000,,....,.,,,0000,,....,.,,,----,,....,.,,,0001,....,.,,,0000,....,.,,,----,....,.,,,0011....,.,,,0000....,.,,,----....,.,,,0110...,.,,,0000...,.,,,----...,.,,,1100..,.,,,1001..,.,,,====..,.,,,0110.,.,,,0000.,.,,,----.,.,,,1100,.,,,1001,.,,,====,.,,,0111.,,,0000.,,,----.,,,1110,,,1001,,,====,,,1011,,1001,,====,,0101,0000,----10111001====0010 = 02 = 2 = 余數?
十進制中,1559 除以 9 等于 173 余 2
雖然在信息數據中,每一位的變化對商的影響微乎其微,但對余數的變化確實顯而易見的。
?
5. 多項式算法
上一節介紹的類似?信息數據除以大除數得余數的方法,我們稱之為 CRC算法思想。
CRC算法在計算機中實現實際上更加神秘,我們需要用一些更抽象的數學符號來理解它。
?
在處理CRC算法時候,我們常聽到“多項式”一詞。一個給定的CRC算法將使用一個特定的"多項式"。
一般來說,CRC算法是用“多項式”運算來操作的,除數、被除數、商、余數,它們都可以被看做具有二元系數的多項式。。
這是什么意思,怎么理解???
被處理的每個數據都可以看做一個字符串,它對應的每個位作為多項式系數。
例如數字 23(十進制),可以看做 17(十六進制)和 10111(二進制)
10111 ,它對應于多項式: ?1*x^4 + 0*x^3 + 1*x^2 + 1*x^1 + 1*x^0
化簡成更簡單的形式為:? x^4 + x^2 + x^1 + x^0
?
利用這樣抽象的方法,我們可以把要處理的 信息數據,除數 都看出是多項式。我們所做的算法和上面一樣,只是里面多了很多?x 。
?
假設我們想 1011 乘以 1101,我們用多項式的表示方法可以表示為
( x^3 + x^1 + x^0 )*( x^3 + x^2 + x^0 )
=(x^6 + x^4 + x^3+ x^5 + x^3 + x^2+ x^3 + x^1 + x^0)
=?x^6 + x^5 + x^4 + 3*x^3 + x^2 + x^1 + x^0
計算到此時候,為了化簡得到最簡,我們必須要假定 x = 2,來化簡 3*x^3 得到結果:
x^7 + x^3 + x^2 + x^1 + x^0
?
As Knuth [Knuth81] says (p.400):
Thus polynomical arithmetic mod 2 is just binary arithmetic mod 2 with no carries. While polynomials provide useful mathematical machinery in more analytical approaches to CRC and error-correction algorithms, for the purposes of exposition they provide no extra insight and some encumbrance and have been discarded in the remainder of this document in favour of direct manipulation of the arithmetical system with which they are isomorphic: binary arithmetic with no carry.
?
能力水平有限,最后這么一大段木有翻譯 !_! , Help!
?
posted on 2017-07-09 15:21 aiyauto 閱讀(...) 評論(...) 編輯 收藏轉載于:https://www.cnblogs.com/aiyauto/p/7141290.html
總結
- 上一篇: JAVA:实现crc校验算法(附完整源码
- 下一篇: iOS 审核被拒绝问题汇总