汉明码编码原理及校验方法分析
作者:祈祷ovo 发布时间:2022-10-09 06:38:13
1.奇偶校验
我们约定一串编码里1的个数是偶数个,那么这串编码里携带的信息就是对的,否则就是错的。我们可以在开头对这串编码加一位校验码实现奇偶校验。
例子:
我们想传输10010这串码,那么在传输的时候,就传010010,其中在开头的0就是校验位
。
我们想传输10000这串码,那么在传输的时候,就传110000,其中在开头的1就是校验位
。
两个例子的1的个数都是偶数。
2.汉明码
首先汉明码是采用奇偶校验的码。它采用了一种非常巧妙的方式,把这串数字分了组,通过分组校验来确定哪一位出现了错误。并且能对错误的位置进行改正
注意:
汉明码默认一串数据只错一位
汉明码怎么分组:
我们看到,其实有些数据是既在P1组又在P2组的。怎么分组,这个要记住,没啥原理了哈哈。要预先做的工作是,把表示位置的这个数,转化成二进制数,也就是:
第1个位置,变成第0001个位置;
第2个位置,变成第0010个位置;
第3个位置,变成第0011个位置;
第4个位置,变成第0100个位置;
第5个位置,变成第0101个位置;
第6个位置,变成第0110个位置;
那么,规定来了,
凡是位置符合这种形式的,XXX1,归到P1;
凡是位置符合这种形式的,XX1X,归到P2;
凡是位置符合这种形式的,X1XX,归到P3;
凡是位置符合这种形式的,1XXX,归到P4;
那么显然各个校验码也被分到各个组里面去了,而且,每个组只有一个校验码。
我举个例子:
我们想传这一组码:XX1X101X011
一共11位。
标X的是校验码的位置,我们暂时不知道它的值是多少。
位置在1,3,5,7,9,11的数据进到P1组。(你转换一下这些位置的二进制,就知道他们的位置符合XXX1)
位置在2,3,6,7,10,11的数据进到P2组。(位置符合XX1X)
位置在4,5,6,7的数据进到P3组。(位置符合X1XX)
位置在8,9,10,11的数据进到P4组。(位置符合1XXX)
那么确定了分组,校验码的值也就顺便确定下来了。
这样整个串的码就确定下来了。
校验码的位置:
这是规定,记住它,在采用汉明码的一串数据中,2的i次方的位置上,我们放校验码。
校验码是1,或者是0,使得校验码所在的组的1的个数是偶数。
如图:
绿色的位置是放校验码的地方,1,2,4,8,16……等等,2的i次方的地方。
校验码其实是每一个分组特有的,每个分组特有的也就只有校验码
从发送者的角度,我该怎么发用上汉明码的数据呢:
首先我们考虑我们到底要发多少位。假设校验码一共k位,我们想发的原始数据一共n位,要注意我们的校验码也要校验校验码错没错,所以,要校验的一共有k+n位,k位校验码可以检测2^k位的码,但是不能所以,校验码的位数要满足这个公式
2 k > k + n 2^k>k+n 2k>k+n,或者说 2 k − 1 ≥ k + n 2^{k}-1 \geq k+n 2k−1≥k+n
这样我们就能算出来要用多少校验码了。
其实哈,实际上不用这么麻烦,教科书总是那么复杂。假设你想发101011111,那你就先占下校验位,然后空着的位填你想发的数据就好。
占下1,2,4,8……等等位,看能占下多少位就可以,当然这个手算比较直观啦哈。
好,我假设你填完了,然后分好组,也确定了校验位的值了,那么发送出去啦~
我是接收者,我收到了一串汉明码,怎样用汉明码的性质来检错呢:
1.分组,分好P1,P2,P3……
2.分别对每个组校验,没有错的给它0,有错的给1.
3.记得第一个问题,汉明码的原理吗?你可能会想,3个组,我们可以画3个圈,可是100个组,这个圈可就太难画了啊!
这里有一个等价的方法,hamming真的太聪明了。
把P从大到小排列起来,得到一串1010,
for example:
组别: P5 P4 P3 P2 P1
标志: 1 0 1 0 1
从大到小排列起来,标志排成了一串一零串。这个数就是出错的数据的位置。
本例中,10101位置上的位错了,换成十进制是第21个位置上的数错了。
然后,我们发现了它错误的位置,又因为它是二进制的,不是0就是1,所以,可以顺便把它纠错。
来源:https://blog.csdn.net/qq_45737068/article/details/109615170


猜你喜欢
- Python 包含6种数据类型,其中Number(数字)、String(字符串)、Tuple(元组)、List(列表)、Dictionary
- #!/bin/sh#code by scpman#功能:检查并修复mysql数据库表#将此脚本加到定时中,脚本执行时,等会读库,列出要修复的
- 在实际的应用中,Access做应用程序时,经常会做成"数据"和"程序"两个数据库,"数据&
- 我们知道,微信公众号开发分订阅号和服务号,而个人只能申请订阅号,订阅号不能设置菜单,无形中只能通过关键字回复实现,比如我回复帮助,就返回帮助
- 要读懂这些代码主要是要了解ASP中操作二进制数据的对象ADODB.Stream!本程序主要用的就是Adodb.Stream,如果你有这个基础
- 目录简介Spare data的例子SparseArraySparseDtypeSparse的属性Sparse的计算SparseSeries
- 现在网页的设计都讲究整体统一风格,无论是网页的文字、图像,还是浏览器的滚动条都要求颜色和风
- 前言:多态的实现必须满足两个前提条件1.继承:多态一定是发生在子类和父类之间2.重写:多态子类重写了父类的方法记住这两点再结合代码示例有助于
- 在网页中,我们经常需要引用大量的javascript和css文件,在加上许多javascript库都包含debug版和经过压缩的releas
- 在使用的django做测试平台时,,多多少少都会遇到需要定时任务的功能,比如定时执行任务,检查订单之类的。可能是一段时间,比如每隔 10分钟
- 最近从某网站下载了一批文档,但是文件是用数字串命名的文档(很多图书馆都这样吧),现在我也下载完了这些文件,也有这些文件的列表,就是不能一个一
- 英文文档:classmethod(function)Return a class method for function.A class m
- numpy.amin()和numpy.amax()numpy.amin()用于计算数组中元素沿着指定轴的最小值。numpy.amax()用于
- 与上篇实践教程一样,在这篇文章中,我将继续从一种常见的功能——表格入手,展示Vue.js中的一些优雅特性。同时也将对filter功能与com
- 一、界面介绍文件导航区域 能够 浏览/定位/打开 项目文件文件编辑区域 能够 编辑 当前打开的文件控制台区域 能够:输出程序执行内容跟踪调试
- Django提供了一个新的类来帮助管理分页数据,这个类存放在django/core/paginator.py.它可以接收列表、元组或其它可迭
- 在我的职业生涯中,我写过、用过和看到过很多随意的脚本。一些人需要半自动化完成任务,于是它们诞生了。一段时间后,它们变得越来越大。它们在一生中
- SQL Server与Oracle、DB2的优劣对比:1.开放性:SQL Server只能在Windows上运行,没有丝毫的开放性,操作系统
- 目录安装基本操作打开图像转换格式展示图片剪裁合并缩略图旋转滤镜二次创作画线文字总结文 | 豆豆来源:Python 技术「ID: python
- 我们在上传大文件时,可能会由于服务器的原因导致文件上传失败,文件过大时由于服务器的配置或响应事件过长导致上传文件失败,这时候我们可以将一个大