文档章节

CRC校验程序设计

乐搏学院
 乐搏学院
发布于 2016/12/07 10:06
字数 1177
阅读 47
收藏 2

程序的宗旨:通过编写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型的数组,存放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的专栏” 博客

© 著作权归作者所有

乐搏学院
粉丝 9
博文 526
码字总数 707467
作品 0
丰台
程序员
私信 提问
常用算法 之五 数据校验(CRC 原理、LRC、奇偶校验、校验和)详解

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 https://blog.csdn.net/ZCShouCSDN/article/details/94131769 数据校验   数据在传输的过程...

ZCShouEXP
07/03
0
0
C#CRC16 Modbus 效验算法

CRC校验(循环冗余校验)小知识 CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(...

梦想PHOTO
2018/11/09
0
0
CRC校验码生成与数据校验源码程序(逐位运算法) (包括CRC-4,5,6,7,8,16,32)

Python有个库pycrc ,可以根据配置参数自动生成各种CRC校验的C语言代码,可以去用一下.当然我是在造完轮子之后才发现的。 CRC的 逐位运算法 和 查表法 是两种独立的操作。 查表法是空间换时间,...

Backspace110
2016/10/05
0
0
android apk 防止反编译技术第五篇-完整性校验(转)

一、完整性校验原理 所谓完整性校验就是我们用各种算法来计算一个文件的完整性,防止这个文件被修改。其中常用的方法就是计算一个文件的CRC32的值或者计算一个文件的哈希值。我们在防止apk被...

我是IT码农
2015/05/25
188
0
C++ Exercises(十六)---Ethernet帧包结构解析

复制代码 ///////////////////////////// ///帧信息类 ///////////////////////////// class CFrame { public: CFrame(void); ~CFrame(void); void setSerialNumber(int nSN); void setPreCo......

阿里云_云栖社区
2018/01/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

总结:Linux

一、目录 目录 作用 /bin 存放二进制可执行文件(ls,cat,mkdir等),常用命令一般都在这里。 /etc /home 存放所有用户文件的根目录,是用户主目录的基点,比如用户user的主目录就是/home/user,...

浮躁的码农
20分钟前
4
0
什么是 happens-before 原则?

Java 中 happens-before 原则,是在 JSR-133 中提出的。 原文摘要: • Each action in a thread happens-before every subsequent action in that thread. • An unlock on a monitor happe......

ConstXiong
32分钟前
5
0
8核AMD Zen加持:微软Surface这回血拼

微软定于10月2日在纽约举办Surface新品发布会,几乎全线消费级产品都将更新,比如15英寸Surface Laptop 3。 最新爆料称,15寸Surface Laptop 3预计一口气推出6款型号,其中顶配为8核AMD处理器...

linuxCool
33分钟前
4
0
BeginnersBook MongoDB 教程

来源:ApacheCN BeginnersBook 翻译项目 译者:飞龙 协议:CC BY-NC-SA 4.0 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 请您勇敢地去翻译和改进翻译。虽然我们追求卓越,但我们并...

ApacheCN_飞龙
35分钟前
5
0
Java NIO:Buffer、Channel 和 Selector

本文将介绍 Java NIO 中三大组件 Buffer、Channel、Selector 的使用。 本来要一起介绍非阻塞 IO 和 JDK7 的异步 IO 的,不过因为之前的文章真的太长了,有点影响读者阅读,所以这里将它们放到...

乱世当空
36分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部