歡迎您光臨本站 登入註冊首頁

CRC演演演演算法原理及C語言實現

admin @ 2014-03-14 , reply:0

概述

CRC演演演演算法原理及C語言實現   有一篇好文章,不敢獨享!CRC演演演演算法原理及C語言實現(介紹了3種方法)CRC演演演演算法原理及C語言實現 -來自(我愛單片機) ……

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與多項式有關。

[admin via 研發互助社區 ] CRC演演演演算法原理及C語言實現已經有3007次圍觀

http://cocdig.com/docs/show-post-381.html