CRC校验程序设计

程序的宗旨:经过编写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的专栏” 博客

相关文章
相关标签/搜索