热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

海明码校验程序设计

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

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,分别代表:输入串寄存器、海明编码寄存器、海明码检错寄存器、海明码检错数据寄存器、海明码检错校验值寄存器
其中:
输入串寄存器:用于存放用户输入的二进制串
海明编码寄存器:存放加入海明码校验码后的二进制串

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

 

4.3 程序流程图

 

 

5. 程序效果图

 

 

原文转自: 乐搏学院http://www.learnbo.com/front/article/cmsIndex
推荐阅读
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 无线认证设置故障排除方法及注意事项
    本文介绍了解决无线认证设置故障的方法和注意事项,包括检查无线路由器工作状态、关闭手机休眠状态下的网络设置、重启路由器、更改认证类型、恢复出厂设置和手机网络设置等。通过这些方法,可以解决无线认证设置可能出现的问题,确保无线网络正常连接和上网。同时,还提供了一些注意事项,以便用户在进行无线认证设置时能够正确操作。 ... [详细]
  • 本文介绍了游戏开发中的人工智能技术,包括定性行为和非定性行为的分类。定性行为是指特定且可预测的行为,而非定性行为则具有一定程度的不确定性。其中,追逐算法是定性行为的具体实例。 ... [详细]
  • JavaScript设计模式之策略模式(Strategy Pattern)的优势及应用
    本文介绍了JavaScript设计模式之策略模式(Strategy Pattern)的定义和优势,策略模式可以避免代码中的多重判断条件,体现了开放-封闭原则。同时,策略模式的应用可以使系统的算法重复利用,避免复制粘贴。然而,策略模式也会增加策略类的数量,违反最少知识原则,需要了解各种策略类才能更好地应用于业务中。本文还以员工年终奖的计算为例,说明了策略模式的应用场景和实现方式。 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
author-avatar
mobiledu2502917123
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有