海明校验码算法和纠错

海明校验码算法和纠错背景介绍由 RichardHammi 于 1950 年提出 还被广泛采用的一种很有效的校验方法 是只要增加少数几个校验位 就能检测出二位同时出错 亦能检测出一位出错并能自动恢复该出错位的正确值的有效手段 后者被称为自动纠错 它的实现原理 是在 k 个数据位之外加上 r 个校验位 从而形成一个 k r 位的新的码字 使新的码字的码距比较均匀地拉大 把数据的每一个二进制位分配在几个不同的偶校验位的组合中 当某一位出错后 就会引起相关的几个校验位的值发生变化 这不但可以发现出错 还能指出是哪一位出错 为进一步自动纠错提供了依

背景介绍

由Richard Hamming于1950年提出、还被广泛采用的一种很有效的校验方法,是只要增加少数几个校验位,就能检测出二位同时出错、亦能检测出一位出错并能自动恢复该出错位的正确值的有效手段,后者被称为自动纠错。它的实现原理,是在k个数据位之外加上r个校验位,从而形成一个k+r位的新的码字,使新的码字的码距比较均匀地拉大。把数据的每一个二进制位分配在几个不同的偶校验位的组合中,当某一位出错后,就会引起相关的几个校验位的值发生变化,这不但可以发现出错,还能指出是哪一位出错,为进一步自动纠错提供了依据。(来自百度百科)

简单来说就是可以校验并纠错

信息位和校验位

海明的校验位在2n上,即校验码在第1,2,4,8位,其余位是信息位,如果信息位数量位K,校验位数量位r,他们满足一下关系:

2r >= K + r + 1

直观的显示:

7 6 5 4 3 2 1
信息位 I4 I3 I2 I1
校验位 r3 r2 r1

校验位的算法

规则:一个信息位由他之前的校验位来校验,且满足信息位位置=校验位位置之和 即:信息位3 = 校验位2 + 校验位1

列举一些信息位和校验位的关系:

数据位 校验位 备注
1 校验位
2 校验位
3 1 + 2
4 校验位
5 4 +1
6 4+2
7 4+2+1
8 校验位

因此, 校验位就由它相关的信息位生成,且规定信息位依次异或得到校验位。列举一些校验位计算公式:

校验位 公式 说明
1 3⨁5⨁7 见上表,3 5 7 都有使用校验位1;3、5、7表示数据位置
2 3⨁6⨁7 同理
3 5⨁6⨁7 同理

举例计算

根据规则计算ob1011的海明校验码。

  1. 确定校验位位数:

    根据公式:2^r^ >= K + r + 1,且已知K=4(因为要计算的原数据为0b1011),从r = 1开始,使用枚举法依次递增取值,计算出第一个符合条件的r值。当然, 根据上面的经验,我们很容易得出r=3的结论。

  2. 画图标定各数据位的值
    8 7 6 5 4 3 2 1
    信息位 1 0 1 1
    校验位 r3 r2 r1
  3. 根据信息位计算校验位

    r1 = 3⨁5⨁7

    r2 = 3⨁6⨁7

    r3 = 5⨁6⨁7

    上面的数字表示数据位下标

    r1 = 1⨁1⨁1 = 1

    r2 = 1⨁0⨁1 = 0

    r3 = 1⨁0⨁1 = 0

  4. 获取到最终数据
    8 7 6 5 4 3 2 1
    信息位 1 0 1 1
    校验位 0 0 1
    终值 1 0 1 0 1 0 1

纠错

如果传输工程中发生了错误,如: –>

  1. 将接收到的值取出信息位和校验位:
    8 7 6 5 4 3 2 1
    信息位 1 0 0 1
    校验位 0 0 1
  2. 根据接收的信息位计算出校验位:

    r1 = 3⨁5⨁7

    r2 = 3⨁6⨁7

    r3 = 5⨁6⨁7

    r1 = 1⨁0⨁1 = 0

    r2 = 1⨁0⨁1 = 0

    r3 = 0⨁0⨁1 = 1

  3. 将接收信息计算的校验位和接收到的校验位按位异或:

    001⨁100 = 101

  4. 将上一步计算结果转为10进制,即为错误位数

    0b101 = 5

  5. 将错误位取反,即可获取到正确的数据
    8 7 6 5 4 3 2 1
    信息位 1 0 0->1 1
    校验位 0 0 1
    终值 1 0 1 0 1 0 1

    读数:

    成功取得正确数据。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/218087.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午8:04
下一篇 2026年3月18日 上午8:05


相关推荐

  • AOP实现原理详解[通俗易懂]

    AOP实现原理详解[通俗易懂]转载地址:https://my.oschina.net/elain/blog/382494一、什么是AOPAOP(Aspect-OrientedProgramming,面向切面编程),可以说是OOP(Object-OrientedPrograming,面向对象编程)的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入…

    2025年6月20日
    6
  • dwcss样式中英对照_dw-cs5-css规则英汉对照表.docx

    dwcss样式中英对照_dw-cs5-css规则英汉对照表.docxdw-cs5-css规则英汉对照表.docx一、类型FONTFAMILY字体FONTSIZE字体大小FONTSTYLE字体风格,如斜体、正常等LINEHEIGHT行高(用来设定字行间距)FONTWEIGHT字体浓淡FONTVARIANT字体变量(用来设定字体是正常显示,还是以小型大写字母显示)TEXTTRANS文本转换(用来设定字体的大小写转换)TEXTDECORATION(字体装饰)UNDER…

    2022年5月17日
    46
  • mysql备份命令_mysql命令行备份方法[通俗易懂]

    mysql备份命令_mysql命令行备份方法[通俗易懂]一、mysql备份1、备份命令格式:mysqldump-h主机IP-P端口-u用户名-p密码–database数据库名>文件名.sql#本地备份可以不添加端口和主机IP,username、passward是数据库用户名和密码mysqldump-h*.*.*.*-p3306-uusername-ppassword–databasemysql>…

    2022年6月22日
    32
  • SAE J1939物理层

    SAE J1939物理层在SAEJ1939-11和ISO11898中对商用车使用的线束都是屏蔽双绞线,即为除了电源、地、CAN_H、CAN_L之外还有一个屏蔽线,并且所有ECU的屏蔽线都接到同一个地线上,一般接地点选择在网络的中央位置上。但是在实际使用中,多数整车厂使用的都是非屏蔽双绞线,比较而言,非屏蔽双绞线的EMC特性要差一些,在1939中正常使用屏蔽双绞线一路CAN网络上最多可以接入30个ECU,而对于非屏蔽双

    2022年5月22日
    37
  • mac安装Android SDK

    mac安装Android SDK1、利用Androidsdk包进行安装:下载Androidsdk包后,点击tools下的android执行文件,SDKmanager打开空白。看网上教程需要重装sdk解决。重装sdk后,SDKmanager打开正常但无法选中各安装包前的复选框和安装按钮(整个SDKmanager点击无响应)。这个问题长时间未解决,所以放弃了此种方法。2、利用Androidcommand-line-tools安装。这种方法大概思路是:下载Androidcmdline-tools->用下载包中的s

    2022年7月21日
    21
  • allure安装配置「建议收藏」

    allure安装配置「建议收藏」一、下载allurehttps://dl.bintray.com/qameta/generic/io/qameta/allure/allure/2.7.0/allure-2.7.0.zip二、检查本机是否有java的运行环境1、win+r输入cmd回车打开终端窗口打开效果入下2、输入java回车安装成功效果如下:安装未成功效果如下:3、输入javac回车…

    2022年7月26日
    17

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号