CRC演演演演算法原理及C語言實現 有一篇好文章,不敢獨享! CRC演演演演算法原理及C語言實現(介紹了3種方法) CRC演演演演算法原理及C語言實現 -來自(我愛單片機) ժ Ҫ 本文從理論上推導出CRC演演演演算法實現原理,給出三種分別適應不同計算機或微控制器硬體環境的C語言程序。讀者更能根據本演演演演算法原理,用不同的語言編寫出獨特風格更加實用的CRC計算程序。 關鍵詞 CRC 演演演演算法 C語言 1 引言 循環冗餘碼CRC檢驗技術廣泛應用於測控及通信領域。CRC計算可以靠專用的硬體來實現,但是對於低成本的微控制器系統,在沒有硬體支持下實現CRC檢驗,關鍵的問題就是如何通過軟體來完成CRC計算,也就是CRC演演演演算法的問題。 這裡將提供三種演演演演算法,它們稍有不同,一種適用於程序空間十分苛刻但CRC計算速度要求不高的微控制器系統,另一種適用於程序空間較大且CRC計算速度要求較高的計算機或微控制器系統,最後一種是適用於程序空間不太大,且CRC計算速度又不可以太慢的微控制器系統。 2 CRC簡介 CRC校驗的基本思想是利用線性編碼理論,在發送端根據要傳送的k位二進位碼序列,以一定的規則產生一個校驗用的監督碼(既CRC碼)r位,並附在信息後邊,構成一個新的二進位碼序列數共(k+r)位,最後發送出去。在接收端,則根據信息碼和CRC碼之間所遵循的規則進行檢驗,以確定傳送中是否出錯。 16位的CRC碼產生的規則是先將要發送的二進位序列數左移16位(既乘以 )后,再除以一個多項式,最後所得到的餘數既是CRC碼,如式(2-1)式所示,其中B(X)表示n位的二進位序列數,G(X)為多項式,Q(X)為整數,R(X)是餘數(既CRC碼)。 (2-1) 求CRC碼所採用模2加減運演演演演算法則,既是不帶進位和借位的按位加減,這種加減運算實際上就是邏輯上的異或運算,加法和減法等價,乘法和除法運算與普通代數式的乘除法運算是一樣,符合同樣的規律。生成CRC碼的多項式如下,其中CRC-16和CRC-CCITT產生16位的CRC碼,而CRC-32則產生的是32位的CRC碼。本文不討論32位的CRC演演演演算法,有興趣的朋友可以根據本文的思路自己去推導計算方法。 CRC-16:(美國二進位同步系統中採用) CRC-CCITT:(由歐洲CCITT推薦) CRC-32: 接收方將接收到的二進位序列數(包括信息碼和CRC碼)除以多項式,如果餘數為0,則說明傳輸中無錯誤發生,否則說明傳輸有誤,關於其原理這裡不再多述。用軟體計算CRC碼時,接收方可以將接收到的信息碼求CRC碼,比較結果和接收到的CRC碼是否相同。 3 按位計算CRC 對於一個二進位序列數可以表示為式(3-1): (3-1) 求此二進位序列數的CRC碼時,先乘以 后(既左移16位),再除以多項式G(X),所得的餘數既是所要求的CRC碼。如式(3-2)所示: (3-2) 可以設: (3-3) 其中 為整數, 為16位二進位餘數。將式(3-3)代入式(3-2)得: (3-4) 再設: (3-5) 其中 為整數, 為16位二進位餘數,將式(3-5)代入式(3-4),如上類推,最後得到: (3-6) 根據CRC的定義,很顯然,十六位二進位數 既是我們要求的CRC碼。 式(3-5)是編程計算CRC的關鍵,它說明計算本位后的CRC碼等於上一位CRC碼乘以2后除以多項式,所得的餘數再加上本位值除以多項式所得的餘數。由此不難理解下面求CRC碼的C語言程序。*ptr指向發送緩衝區的首位元組,len是要發送的總位元組數,0x1021與多項式有關。 |