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

 更新时间:2021年09月16日 11:20:51   作者:祈祷ovo  
汉明码在传输的消息流中插入验证码,当计算机存储或移动数据时,可能会产生数据位错误,以侦测并更正单一比特错误。由于汉明编码简单,它们被广泛应用于内存RAM

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

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

相关文章

  • 好用的VSCode头部注释插件Fileheader Pro

    好用的VSCode头部注释插件Fileheader Pro

    这篇文章主要为大家介绍了VSCode头部注释插件Fileheader Pro的使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • typescript 实现RabbitMQ死信队列和延迟队列(订单10分钟未付归还库存)的过程

    typescript 实现RabbitMQ死信队列和延迟队列(订单10分钟未付归还库存)的过程

    RabbitMQ作为一款流行的消息队列服务,提供了死信队列(Dead Letter Exchange)功能,能够有效地处理消息被拒绝、消息过期以及队列达到最大长度等情况,本文将介绍如何利用RabbitMQ的死信队列来处理这三种情况,并提供了TypeScript示例代码,需要的朋友可以参考下
    2024-03-03
  • bower 强大的管理web包管理工具

    bower 强大的管理web包管理工具

    bower是twitter的又一个开源项目,使用nodejs开发,用于web包管理。如果越来越多得开源项目都托管在github上,bower只需要将github上项目加上一个配置文件既可以使用bower方式使用安装包
    2013-12-12
  • 献给写作者的 Markdown 新手指南

    献给写作者的 Markdown 新手指南

    Markdown 是一种「电子邮件」风格的「标记语言」,我们强烈推荐所有写作者学习和掌握该语言。为什么
    2016-08-08
  • Jenkins部署war包和部署jar包的详细步骤

    Jenkins部署war包和部署jar包的详细步骤

    这篇文章主要介绍了Jenkins部署war包和部署jar包的详细步骤,本恩分步骤通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • Delphi 本地路径的创建、清空本地指定文件夹下的文件

    Delphi 本地路径的创建、清空本地指定文件夹下的文件

    这篇文章主要介绍了Delphi 本地路径的创建、清空本地指定文件夹下的文件,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • 总结一些你可能不知道的ip地址

    总结一些你可能不知道的ip地址

    IP对大家来说应该再熟悉不过了,但其实IP地址有一些不为人知的事情,可能你并不知道。例如短IP、不同进制的ip等,所以下面这篇文章主要给大家总结介绍了一些你可能不知道的ip地址知识,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-07-07
  • 滑动验证码的设计与理解

    滑动验证码的设计与理解

    这篇文章主要介绍了滑动验证码的设计与理解,本文通过实例代码给大家介绍小网站是怎么设计的,代码简单易懂,需要的朋友可以参考下
    2019-08-08
  • 微信支付、支付宝支付等常用第三方支付通道接口手续费对比

    微信支付、支付宝支付等常用第三方支付通道接口手续费对比

    微信支付、支付宝等第三方支付,需要和银联、网联对接,有清算机构和银行的交易处理通道成本。费率指支付手续费的费率,不同行业、不同的支付平台、不同的支付额度或次数所对应的通道费率是不一样的。
    2023-01-01
  • GBK字符编码(字符集)缺陷导致web安全漏洞

    GBK字符编码(字符集)缺陷导致web安全漏洞

    很多时候,一个web站点,选择什么样的字符编码,我们不会太过在意的。象中文网站,我们一般用gb2312,gbk,gb18030,也可以用utf-8。但是,可能我们不知道,选择不同编码,可能因此导致程序本身设计缺陷
    2016-06-06

最新评论