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型的數組,存放Hx)
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)
輸入字符串驗證
本文出自 “對影成三人” 博客,請務必保留此出處http://ticktick.blog.51cto.com/823160/176981