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。
 
 
经过迭代运算后,最终得到的r10001100,这就是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  程序运行效果及验证
 

 

 输入字符串验证