程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> CRC校驗程序設計

CRC校驗程序設計

編輯:關於C語言

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)

定義兩個Cstring型的變量,存放輸入的數據和輸出的數據。
4.2 模塊劃分   模塊功能概述:
    輸入模塊:獲取用戶的輸入二進制串,並判斷輸入的正確性
寄存器初始化模塊:將用戶的輸入字符串轉化成0、1形式的數字串存放到輸入串寄存器中,並取出前9位數存放到操作寄存器中作為當前的被減數。
    校驗碼計算模塊:對操作寄存器的每一位與Hx)的對應的每一位進行異或,並將結果存放在操作寄存器的對應位置
    操作寄存器移位模塊:讓當前操作寄存器隊列隊首的所有0出隊,並從剩余寄存器中補充對應個數的數據到操作寄存器隊列隊尾,供下一次異或操作。
顯示模塊:將操作寄存器最終的CRC校驗碼轉化成字符串的形式以供輸出。
  4.3 程序流程圖     5  程序運行效果及驗證  

 
 輸入字符串驗證

本文出自 “對影成三人” 博客,請務必保留此出處http://ticktick.blog.51cto.com/823160/176981

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved