迴圈冗餘校正碼CRC演算法實現

來源:互聯網
上載者:User

(轉自http://www.equn.com/forum/viewthread.php?tid=5470&sid=3rrqVomR)   

CRC校正碼的基本思想是利用線性編碼理論, 在發送端根據要傳送的k位二進位碼序列,以一定的規則產生一個校正用的監督碼(既CRC碼)r位,並附在資訊後邊,構成一個新的二進位碼序列數共(k+r)位,最後發送出去。在接收端,則根據資訊碼和CRC碼之間所遵循的規則進行檢驗,以確定傳送中是否出錯。
    在資料存放區和資料通訊領域,CRC無處不在:著名的通訊協議X.25的FCS(幀檢錯序列)採用的是CRC. CCITT,ARJ、LHA等壓縮公用程式軟體採用的是CRC32,磁碟機的讀寫採用了CRC16,通用的映像儲存格式GIF、TIFF等也都用CRC作為檢錯手段。
    CRC的本質是模-2除法的餘數,採用的除數不同,CRC的類型也就不一樣。通常,CRC的除數用產生多項式來表示。最常用的CRC碼的產生多項式有CRC16,CRC32.
    以CRC16為例,16位的CRC碼產生的規則是先將要發送的二進位序列數左移16位(既乘以2^16)後,再除以一個多項式,最後所得到的餘數既是CRC碼,如下式所示,其中K(X)表示n位的二進位序列數,G(X)為多項式,Q(X)為整數,R(X)是餘數(既CRC碼)。
K(X)>>16=G(x)Q(x)+R(x)
    求CRC碼所採用模2加減運演算法則,既是不帶進位和借位的按位加減,這種加減運算實際上就是邏輯上的異或運算,加法和減法等價,乘法和除法運算與普通代數式的乘除法運算是一樣,符合約樣的規律。產生CRC碼的多項式如下,其中CRC-16和CRC-CCITT產生16位的CRC碼,而CRC-32則產生的是32位的CRC碼
    接收方將接收到的二進位序列數(包括資訊碼和CRC碼)除以多項式,如果餘數為0,則說明傳輸中無錯誤發生,否則說明傳輸有誤,關於其原理這裡不再多述。用軟體計算CRC碼時,接收方可以將接收到的資訊碼求CRC碼,比較結果和接收到的CRC碼是否相同。
    CCITT推薦的高階資料連結控制規程HDLC的幀校正序列FCS中,使用CCITT-16即CRC16,其產生多項式為G(x)=x16+x12+x5+1, CRC-32的產生多項式為G(x)=x32+x26+x23+x22+x16+x11+x10+x16+x8+x7+x5+x4+x2+x+1

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.