程序的宗旨:經過編寫CRC的校驗程序,加深對CRC原理的理解,同時學會將書本上的原理運用於實際,動手實踐才能學得更快。c++
注:本文關於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-八、CRC-3二、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 程序運行效果及驗證
輸入字符串驗證
結束語
免費學習更多精品課程,登陸樂搏學院官網http://h.learnbo.cn/
或關注咱們的官方微博微信,還有更多驚喜哦~
本文出自 「Jhuster的專欄」 博客