CRC校验程序设计

简介:
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型的数组,存放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  程序运行效果及验证
 

 

 输入字符串验证



本文转自 Jhuster 51CTO博客,原文链接:http://blog.51cto.com/ticktick/176981,如需转载请自行联系原作者
相关文章
|
Python 测试技术 算法
蓝桥杯-02-python组考点与14届真题
蓝桥杯-02-python组考点与14届真题
|
前端开发
【HTML专栏2】VSCode的使用(新建HTML文件)
【HTML专栏2】VSCode的使用(新建HTML文件)
1439 0
|
2月前
|
人工智能 Rust JavaScript
uv 这个工具被 OpenAI 收购了
AI Coding 竞争正从“生成代码”转向“执行闭环”。OpenAI收购Python工具链公司Astral、Anthropic收购JS运行时Bun,均旨在强化底层执行层——涵盖环境管理、测试验证与静态分析,构建Coding Agent所需的反馈回路。这标志着AI工程重心下沉至本地工具链,“Harness Engineering”成为新战略高地。
215 5
|
2月前
|
人工智能 自然语言处理 搜索推荐
生成式引擎优化(GEO)的深层逻辑:超越内容堆砌的“两大核心+四轮驱动”范式研究
本文旨在深入探讨GEO优化的本质,驳斥其仅为“内容堆砌”的片面认知。
337 15
|
4月前
|
存储 关系型数据库 MySQL
阿里云数据库产品支持免费试用吗?最新可试用数据库规格信息、配置及可试用人群参考
2026年阿里云数据库试用活动的核心内容参考,涵盖26款可试用数据库产品,包括RDS MySQL、Tair、PolarDB、AnalyticDB等主流类型,覆盖Serverless、集群版、多模态等多种形态。活动支持个人与企业认证用户,适用场景涵盖开发测试、生产环境、AI集成、实时分析等。新用户可享免费试用额度及后续折扣。
1047 6
|
编译器 C语言
C语言中的浮点数:深入探索与应用
C语言中的浮点数:深入探索与应用
2931 1
|
存储 安全 Cloud Native
阿里云数据库多款产品支持米哈游新游《绝区零》全球开服!
这一次,阿里云继续与大家共同守护「新艾利都」!
|
数据采集 分布式计算 Kubernetes
Apache Flink 实践问题之ZooKeeper 网络瞬断时如何解决
Apache Flink 实践问题之ZooKeeper 网络瞬断时如何解决
454 4
|
机器学习/深度学习 人工智能 前端开发
「随笔」IT行业哪个方向比较好就业
IT行业就业前景广阔,受PEST因素驱动:政府政策支持如中国“互联网+”、美国“数字化美国”;全球经济复苏及云计算、大数据市场增长;社会数字化转型和人才短缺;科技发展如AI、5G、物联网创造新职位。网络、软件、前端、后端、UI、大数据、AI和物联网是主要就业方向,前端开发需掌握HTML、CSS、JS及新框架,强调团队合作、创新和用户体验。随着技术进步,前端开发将迎来更多机遇和挑战。
487 0
|
存储 Oracle 关系型数据库
关系型数据库Oracle备份类型与频率
【7月更文挑战第21天】
410 6