海明码校验程序设计

简介:

1. 需求分析

(1)海明码编码:
输入:一串二进制数据串
输出:插入海明码后的二进制数据串
(2)海明码纠错:
输入:一串含海明码的二进制数据串
输出:通过海明码校验,检查该二进制串是否有错,若有错误,则对错误位进行纠错,将纠错后的二进制串输出。
 

2. 海明码校验原理分析

         这里我们仅从编程实现的角度分析海明码的编码及纠错的实现算法,书本上采用的是矩阵相乘的方法,但矩阵相乘的方法程序执行效率不高,故通过在网上的搜索及自己的总结,得出如下的程序实现算法。
 
2.1 海明码编码的原理分析

编码步骤
(1) 根据信息位数,确定校验位数。 
k—信息位数
r—校验位数
求出满足不等式的最小r,即为校验位数。
(2)计算校验位公式
 
特别注意:
校验位 r n所在位数为  2^n ,其余由信息位填充。
位数和信息位由1起始,而校验位由0起始。
将每个信息比特由位置对应的位数写成2的幂之和的形式。
例如I8对应的第十二位12=2^3+2^2 ,I7对应的第十一位11=2^3+2^1+2^0 ,I6对应的第十位10=2^3+2^1,I5对应的第九位9=2^3+2^0  一直写到对应的第三位。
校验位r n由前面位数写成2的幂之和中包含2 ^n的位数对应的信息为之和构成
例如r3=I8+I7+I6+I5
(3)求校验位。
根据计算公式求出各校验位。
(4) 求海明码
根据上面的表格填充后,写出海明码。
例 对一段信息1011,写出海明码。
根据上面步骤,解答如下
1、 2^r≥4+r+1,确定校验位位3位2^3≥4+3+1.
2、 根据步骤
 
7=2^2+2^1+2^0, 6=2^2+2^1, 5=2^2+2^0,3=2^1+2^0,
r2=I4+I3+I2
r1=I4+I3+I1
r0=I4+I2+I1
3、 根据公式的r2 = 0, r1 =0, r0 =1 
4、 添入表格   
 
得海明码1010101

2.2 海明码纠错原理分析
(1)根据海明码的信息位和校验位的分布规则,找出接收到的数据的信息位以及校验位。
  

如有已经编码的数据 1100 1001 0111,则可以根据上表得到编码的信息为:1100 0011;校验位为:1011。 
(2)接收端对校验位进行验证
Sn= rn ( 校验)+ rn (接收)
(3)判断校正因子是否有错,并改正。
Sn Sn-1 Sn-2……S0二进制对应的是那位就是那位出错,将其改正完成纠错。如1001为第九位,将第九位1变0 (或0变1) 即可。
 

3. 概要设计


基于以上原理,我们对软件进行了初步的规划和设计:
(1) 为了提供友好的用户界面,我们采用Visual C++的MFC框架构建应用程序,使用一个简单的对话框程序,包含两个部分,一部分为海明码编码部分,另一部分为海明码纠错部分。
(2) 由于本程序仅仅是海明码原理性的验证性程序,故只设计了对最长8位数据的海明码的编码,以及最长12位的海明码校验。
(3) 从上述原理可知,海明码的编码和纠错可以使用如上所述的公式进行,故数据结构只需要采用一个vector容器存放相应的数据即可,不需要其他负责的数据结构。
 

4. 详细设计


4.1 数据结构的设计
定义五个bool型的容器,vector<bool>,分别代表:输入串寄存器、海明编码寄存器、海明码检错寄存器、海明码检错数据寄存器、海明码检错校验值寄存器
其中:
输入串寄存器:用于存放用户输入的二进制串
海明编码寄存器:存放加入海明码校验码后的二进制串
海明码检错寄存器:存放需要纠错的二进制串
海明码检错数据寄存器:存放需要纠错的二进制串的数据部分
海明码检错校验值寄存器:存放需要纠错的二进制串的校验码部分
4.2 模块划分
 
模块功能概述:
(1)海明码编码
输入模块:获取用户的输入二进制串,并判断输入的正确性
寄存器初始化模块:将用户的输入字符串转化成0、1形式的数字串存放到输入串寄存器中,并且将数据依次存放到海明编码寄存器,存放时将2的幂次的位置空出来(置0)作为存放校验码。
校验码计算模块:根据上面描述的编码算法对校验码的值进行计算并存储在对应的位置。 
显示模块:将海明编码寄存器中的二进制串转化成字符串的形式以供输出。
(2)海明码纠错
输入模块:获取用户的输入二进制串,并判断输入的正确性
寄存器初始化模块:将用户的输入字符串转化成0、1形式的数字串存放到检错寄存器中,根据当前位置是否为2的幂次将二进制串分为数据和校验码分别存放到检错数据寄存器和检错校验值寄存器
海明码纠错模块:根据上面描述的纠错算法对数据进行校验,并纠错。
显示模块:将检错寄存器中正确的二进制码转化成字符串的形式以供输出。
 
4.3 程序流程图
 
 

5. 程序效果图




本文转自 Jhuster 51CTO博客,原文链接:http://blog.51cto.com/ticktick/167482,如需转载请自行联系原作者
相关文章
|
存储 自然语言处理 数据处理
信息抽取UIE(二)--小样本快速提升性能(含doccona标注
需求跨领域跨任务:领域之间知识迁移难度高,如通用领域知识很难迁移到垂类领域,垂类领域之间的知识很难相互迁移;存在实体、关系、事件等不同的信息抽取任务需求。 - 定制化程度高:针对实体、关系、事件等不同的信息抽取任务,需要开发不同的模型,开发成本和机器资源消耗都很大。 - 训练数据无或很少:部分领域数据稀缺,难以获取,且领域专业性使得数据标注门槛高。
信息抽取UIE(二)--小样本快速提升性能(含doccona标注
|
SQL XML Java
【MyBatis】动态SQL和mybatis分页的运用
如果我们的前台没有传参,比如没有传入我们的name值,name就会把字段值改为null,这就违背了我们编码的初衷。许多人会使用类似于where 1 = 1来作为前缀,在代码中会用if,再用and进行一个sql拼接。
|
9月前
|
机器学习/深度学习 人工智能 自然语言处理
LEC: 基于Transformer中间层隐藏状态的高效特征提取与内容安全分类方法
通过利用Transformer中间层的隐藏状态,研究提出了层增强分类(LEC)技术,该技术能够以极少的训练样本和参数实现高效的内容安全和提示注入攻击分类,显著提升了模型的性能,并验证了其跨架构和领域的泛化能力。
313 11
LEC: 基于Transformer中间层隐藏状态的高效特征提取与内容安全分类方法
|
10月前
|
算法 安全 网络安全
等保、密评使用的IP地址https证书
等保和密评是确保网络安全的重要环节。IP地址的HTTPS证书通过加密数据传输、符合等保密评要求、提升IP身份辨识度,起到关键作用。证书需国产化、支持国密算法,并建议采用OV或EV证书。申请流程包括准备、选择服务商、申请与验证、签发与部署、验证与测试。定期检查证书有效期,确保持续有效性。
|
10月前
|
人工智能 运维 关系型数据库
云栖大会|数据库与AI全面融合,迈入数据智能新纪元
2024年云栖大会「数据库与AI融合」专场,来自NVIDIA、宇视科技、合思信息、杭州光云科技、MiniMax等企业的代表与阿里云瑶池数据库团队,共同分享了Data+AI全面融合的最新技术进展。阿里云发布了DMS的跨云统一开放元数据OneMeta和智能开发OneOps,推出《云数据库运维》技术图书,并介绍了PolarDB、AnalyticDB、Lindorm和Tair等产品的最新能力,展示了AI在数据库领域的广泛应用和创新。
882 15
|
分布式数据库 数据库 数据安全/隐私保护
开发者关注的数据库技术与创新,未来数据库的演进及理想数据库的构想
作为开发者,想必大家都知道在技术圈中数据库相关领域是技术开发中的重中之重,数据库技术与创新不断推动着数字化时代的发展,数据库技术正在经历着一次创新的浪潮,还有就是数据库技术的不断创新为开发者们在日常实际开发中提供了更多的可能性和好的机遇。那么本文就来简单聊聊最值得开发者关注的数据库技术与创新,包括分布式数据库、图数据库、时序数据库、区块链数据库以及AI与数据库的结合等方面,以及探讨未来数据库的演进趋势,并讨论一下在开发者心目中最理想的数据库的特征与构想。
218 3
|
JavaScript
vue导出excel无法打开问题
vue导出excel无法打开问题
|
域名解析 负载均衡 网络协议
《打造不宕机的电商网站:揭秘Bind和Nginx的负载均衡策略》
【8月更文挑战第13天】在互联网技术快速演进的当下,确保web服务的高可用性和高性能至关重要。本文通过案例分析,探讨如何利用Bind和Nginx实现高效的负载均衡。以一家大型电商网站为例,面对每日上百万次的用户访问请求,通过配置Bind DNS服务器根据策略将域名解析至不同IP地址,并借助Nginx作为反向代理和负载均衡器,将请求按需分发至多个应用服务器,实现了服务的稳定性和高效性。此方案不仅提升了网站的扩展性和可靠性,还增强了对网络流量的控制能力,适用于处理巨大用户量和数据量的服务。
219 0
|
Web App开发 缓存 前端开发
《手把手教你》系列技巧篇(四十四)-java+ selenium自动化测试-处理https 安全问题或者非信任站点-下篇(详解教程)
【5月更文挑战第8天】这篇文档介绍了如何在IE、Chrome和Firefox浏览器中处理不信任证书的问题。作者北京-宏哥分享了如何通过编程方式跳过浏览器的证书警告,直接访问不受信任的HTTPS网站。文章分为几个部分,首先简要介绍了问题背景,然后详细讲解了在Chrome浏览器中的两种方法,包括代码设计和运行效果,并给出了其他浏览器的相关信息和参考资料。最后,作者总结了处理此类问题的一些通用技巧。
387 2
|
Kubernetes API Docker
Docker+K8s基础(重要知识点总结)
Docker+K8s基础(重要知识点总结)
352 0