天天看點

CRC校驗程式設計

CRC程式設計

程式的宗旨:通過編寫CRC的校驗程式,加深對CRC原理的了解,同時學會将書本上的原理運用于實際,動手實踐才能學得更快。

注:本文關于CRC原理那部分内容,來自網絡搜集。

1. 需求分析

編寫一個CRC校驗的模拟程式,該程式實作的功能如下:

輸入:一串二進制比特串

輸出:CRC校驗碼

2. CRC校驗原理分析

在此,我們主要從适合于程式設計實作的角度分析CRC校驗的算法原理,而不隻是書本上關于CRC原理的介紹。

Cyclic Redundancy Check循環備援檢驗,是基于資料計算一組效驗碼,用于核對資料傳輸過程中是否被更改或傳輸錯誤。

假設資料傳輸過程中需要發送15位的二進制資訊g=101001110100001,這串二進制碼可表示為代數多項式g(x) = x^14 + x^12 + x^9 + x^8 + x^7 + x^5 + 1,其中g中第k位的值,對應g(x)中x^k的系數。将g(x)乘以x^m,既将g後加m個0,然後除以m階多項式h(x),得到的(m-1)階餘項r(x)對應的二進制碼r就是CRC編碼。 

h(x)可以自由選擇或者使用國際通行标準,一般按照h(x)的階數m,将CRC算法稱為CRC-m,比如CRC-8、CRC-32、CRC-64等。

g(x)和h(x)的除運算,可以通過g和h做xor(異或)運算。比如将11001與10101做xor運算:

例如使用CRC-8算法求101001110100001的效驗碼。CRC-8标準的h(x) = x^8 + x^7 + x^6 + x^4 + x^2 + 1,即h是9位的二進制串111010101。

經過疊代運算後,最終得到的r是10001100,這就是CRC效驗碼。

3  概要設計

基于以上原理,我們對軟體進行了初步的規劃和設計:

(1) 由于h(x)的選擇有多種标準,其原理都是類似的,故我們就選用CRC-8标準來實作CRC校驗的模拟。

(2) 由上述算法原理可知,程式中需要使用到數組或者隊列來實作資料的存儲和運算,由于c++中支援許多封裝得很好的容器來組織資料,例如:Deque容器,故使用c++語言可以更加高效地完成所需要的功能。故我們的程式設計語言采用c++。

(3) 為了提供友好的使用者界面,我們采用Visual C++的MFC架構建構應用程式,使用一個簡單的對話框程式,包含一個輸入編輯框和一個輸出編輯框

4 詳細設計

4.1 資料結構的設計

    定義三個bool型的隊列,deque<bool>,分别代表:輸入串寄存器、操作串寄存器、剩餘串寄存器。

    其中:

    輸入串寄存器:用于存放使用者輸入的二進制串

    操作串寄存器:用于存放目前的被減數

    剩餘串寄存器:用于存放輸入串寄存器沒有進入操作串寄存器的剩餘部分

定義一個bool型的數組,存放H(x)

const int CRC8_HX_LENGTH = 9; // 采用CRC-8算法,故H(x)的長度為9 

bool hx[CRC8_HX_LENGTH] = {1,1,1,0,1,0,1,0,1};    //!< H(x)

定義兩個Cstring型的變量,存放輸入的資料和輸出的資料。

4.2 子產品劃分

子產品功能概述:

    輸入子產品:擷取使用者的輸入二進制串,并判斷輸入的正确性

寄存器初始化子產品:将使用者的輸入字元串轉化成0、1形式的數字串存放到輸入串寄存器中,并取出前9位數存放到操作寄存器中作為目前的被減數。

    校驗碼計算子產品:對操作寄存器的每一位與H(x)的對應的每一位進行異或,并将結果存放在操作寄存器的對應位置

    操作寄存器移位子產品:讓目前操作寄存器隊列隊首的所有0出隊,并從剩餘寄存器中補充對應個數的資料到操作寄存器隊列隊尾,供下一次異或操作。

顯示子產品:将操作寄存器最終的CRC校驗碼轉化成字元串的形式以供輸出。

4.3 程式流程圖

5  程式運作效果及驗證

 輸入字元串驗證

本文轉自 Jhuster 51CTO部落格,原文連結:http://blog.51cto.com/ticktick/176981,如需轉載請自行聯系原作者

繼續閱讀