汉明码编码原理及校验方法分析

目录
  • 1.奇偶校验
  • 2.汉明码
    • 汉明码怎么分组:
    • 校验码的位置:
      • 从发送者的角度,我该怎么发用上汉明码的数据呢:
      • 我是接收者,我收到了一串汉明码,怎样用汉明码的性质来检错呢:

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,所以,可以顺便把它纠错。

以上就是汉明码编码原理及校验方法分析的详细内容,更多关于汉明码编码及校验的资料请关注我们其它相关文章!

(0)

相关推荐

  • 最全的常用正则表达式大全——包括校验数字、字符、一些特殊的需求等

    一.校验数字的表达式 1 数字:^[0-9]*$ 2 n位的数字:^\d{n}$ 3 至少n位的数字:^\d{n,}$ 4 m-n位的数字:^\d{m,n}$ 5 零和非零开头的数字:^(0|[1-9][0-9]*)$ 6 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$ 7 带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})?$ 8 正数.负数.和小数:^(\-|\+)?\d+(\.\d+)?$ 9 有两位小数的正实数:^[0-9]

  • 关于base64编码的原理及实现方法分享

    一.Base64编码原理 步骤1:将所有字符转化为ASCII码:步骤2:将ASCII码转化为8位二进制:步骤3:将二进制3个归成一组(不足3个在后边补0)共24位,再拆分成4组,每组6位:步骤4:统一在6位二进制前补两个0凑足8位:步骤5:将补0后的二进制转为十进制:步骤6:从Base64编码表获取十进制对应的Base64编码: 说明:不足3个补0的最终Base64编码为=,而不是A! 二.Base64编码示例 示例一:zyq对应Base64编码为enlx 示例二:mzwu对应Base64编码为

  • 汉明码编码原理及校验方法分析

    目录 1.奇偶校验 2.汉明码 汉明码怎么分组: 校验码的位置: 从发送者的角度,我该怎么发用上汉明码的数据呢: 我是接收者,我收到了一串汉明码,怎样用汉明码的性质来检错呢: 1.奇偶校验 我们约定一串编码里1的个数是偶数个,那么这串编码里携带的信息就是对的,否则就是错的.我们可以在开头对这串编码加一位校验码实现奇偶校验. 例子: 我们想传输10010这串码,那么在传输的时候,就传010010,其中在开头的0就是校验位. 我们想传输10000这串码,那么在传输的时候,就传110000,其中在开头

  • node.js中Buffer缓冲器的原理与使用方法分析

    本文实例讲述了node.js中Buffer缓冲器的原理与使用方法.分享给大家供大家参考,具体如下: 一.什么是Buffer Buffer缓冲器是用来存储输入和输出数据的一段内存.js语言没有二进制数据类型,在处理TCP和文件流的时候,就不是很方便了. 所以node.js提供了Buffer类来处理二进制数据,Buffer类是一个全局变量,Buffer在创建的时候大小就固定了,无法改变. Buffer类的实例类似于由字节元素组成的数组,可以有效的表示二进制数据. 二.什么是字节 字节是计算机存储时的

  • PHP防止sql注入小技巧之sql预处理原理与实现方法分析

    本文实例讲述了PHP防止sql注入小技巧之sql预处理原理与实现方法.分享给大家供大家参考,具体如下: 我们可以把sql预处理看作是想要运行的 SQL 的一种编译过的模板,它可以使用变量参数进行定制. 我们来看下它有什么好处: 预处理语句大大减少了分析时间,只做了一次查询(虽然语句多次执行). 绑定参数减少了服务器带宽,你只需要发送查询的参数,而不是整个语句. 预处理语句针对SQL注入是非常有用的,因为参数值发送后使用不同的协议,保证了数据的合法性. 这种预处理呢,可以通过两个方式,咱们这次要说

  • JavaScript设计模式之门面模式原理与实现方法分析

    本文实例讲述了JavaScript设计模式之门面模式原理与实现方法.分享给大家供大家参考,具体如下: 外部与一个子系统的通信必须通过一个系统的一个门面对象进行,这就是门面模式. 门面模式具备如下两个角色: 1. 门面角色 客户端可以调用这个角色方法,此角色中有子系统的应用(知晓相关的(一个或多个)子系统的功能和责任).本角色会将所有从客户端发来的请求委派到相应的子系统去. 2. 子系统角色 可以同时有一个或多个子系统.每一个子系统都不是一个单独的类,而是一些类的集合.每一个子系统都可以被客户端直

  • javascript深拷贝的原理与实现方法分析

    本文实例讲述了javascript深拷贝的原理与实现方法.分享给大家供大家参考,具体如下: 要讲JavaScript的拷贝,就得先讲讲javascript中的值传递和引用传递. javascript中没有一个具体的语法来规定哪些参数是引用传递,而其他语言中都有明文规定,比如 C# 中的 ref 和 PHP 中的 & . 这也是javascript众多弊端中的一个. 我们先看看下面这段代码: //值传递 var i = 3; var j = i; j = 4; document.write(i);

  • Android4.4开发之电池低电量告警提示原理与实现方法分析

    本文实例讲述了Android4.4电池低电量告警提示原理与实现方法.分享给大家供大家参考,具体如下: 之前版本的电池电量低是通过发送 intent ACTION_BATTERY_LOW来实现的,而在android4.4中,通过发送intent ACTION_BATTERY_CHANGED,也就是电池电量只要变化就检查是否需要低电量告警,并且实现挪到了PowerUI中. 路径: frameworks/base/packages/SystemUI/src/com/android/systemui/p

  • JavaScript面向对象继承原理与实现方法分析

    本文实例讲述了JavaScript面向对象继承原理与实现方法.分享给大家供大家参考,具体如下: 1.构造函数.原型和实例的关系 构造函数有一个原型属性prototype指向一个原型对象. 原型对象包含一个指向构造函数的指针constructor . 实例包含一个指向原型对象的内部指针[[prototype]] . 2.通过原型链实现继承 基本思想:利用原型让一个引用类型继承另一个引用类型的属性和方法,子类型可以访问超类型的所有属性和方法.原型链的构建是将一个类型的实例赋值给另一个构造函数的原型实

  • JS浅拷贝和深拷贝原理与实现方法分析

    本文实例讲述了JS浅拷贝和深拷贝原理与实现方法.分享给大家供大家参考,具体如下: 浅拷贝只会拷贝一层,深层的引用类型改变还是会受到影响. 深拷贝是所有内部的属性还有值都被拷贝了一份,不管深层的引用类型怎么改都不会受到影响. 浅拷贝的实现方式 1.自定义函数 function shallowClone (initalObj) { var obj = {}; for ( var i in initalObj) { obj[i] = initalObj[i]; } return obj; } 2.ES

  • PHP设计模式之单例模式原理与实现方法分析

    本文实例讲述了PHP设计模式之单例模式原理与实现方法.分享给大家供大家参考,具体如下: 一.什么是单例模式 作为对象的创建模式,单例模式确保某一个类只有一个实例,并且对外提供这个全局实例的访问入口.它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用. 二.PHP单例模式三要素 1. 需要一个保存类的唯一实例的静态成员变量. 2. 构造函数和克隆函数必须声明为私有的,防止外部程序创建或复制实例副本. 3. 必须提供一个访问这个实例的公共静态方法,从而返回唯一实例的一个引用. 三.为什么使

  • java堆排序原理与实现方法分析

    本文实例讲述了java堆排序原理与实现方法.分享给大家供大家参考,具体如下: 堆是一个数组,被看成一个近似完全二叉树. 举例说明: 堆的性质: 1.已知元素在数组中的序号为i 其父节点的序号为 i/2的整数 其左孩子节点的序号为2*i 其右孩子节点的序号为2*i+1 2.堆分为最大堆和最小堆 在最大堆中,要保证父节点的值大于等于其孩子节点的值 在最小堆中,要保证父节点的值小于等于其孩子节点的值 java实现堆排序 public class MyHeapSort { public void Hea

随机推荐