海明码(汉明码)原理及其计算方法

news2024/11/15 23:44:12

海明码(汉明码)是一种利用奇偶性检测和纠正错误的编码方法。在传输和储存数据时,可能会发生传输错误或数据损坏。海明码通过在数据中添加冗余位来检测错误并进行纠正,提高了传输和存储数据的可靠性。

基本原理:将原始数据分成若干个数据块,并在每个数据块中增加一定数量的校验位,用于检测错误或进行纠正。在数据传输或存储时,接收方会对收到的数据进行校验,检测出错误后通过校验位进行错误纠正,最终得到正确的原始数据。

优点和缺点:能够在较少的冗余位数量下实现高效的错误检测和纠正。缺点是海明码的容错能力有一定限制,当出现多个位错误时可能无法纠正。

海明码的构成方法是在数据位之间的特定位置上插入k个检验位,通过扩大码距来实现检错和纠错。

设数据位是 n 位,校验位是 k 位,则 n 和 k 必须满足以下关系:

2^{k} - 1 \geq n + k

只有当满足以上不等式,海明码才具有检错功能

海明码编码规则如下:

设 k 个校验位为Pk,Pk-1,...,P1,n 个数据位为Dn-1,Dn-2,...,D1,D0,对应的海明码为Hn+k,Hn+k-1,...,H1

第一步: Pi 在海明码的第 2^{i-1} 位置,即Hj = Pi,且j=2^{i-1},数据位则依序从低到高占据海明码中剩下的位置。

第一步什么意思呢,我们来拿一个8位的数据位来举例,首先根据海明码的构成方式,数据位 n = 8,则代入 2^{k} - 1 \geq n + k,k = 4,即校验位为 4 位,那么整个海明码的编码位数一共是 12 位。如下图所示:

根据第一步规则,我们选取所有符合要求的 i 值,即 i = 1,2,3,4符合要求,则 Pi 分别在第1,2,4,8个位置,那么我们给出海明码校验位的位置后,依次将数据位从低到高插入剩下的位置。

此时,第一步已经完成,下面开始进行第二步。

第二步:海明码中的任何一位都是由若干个校验位来校验的。其对应关系如下:被校验的海明位的下标等于所有参与校验该位的校验位的下标之和,而校验位由自身校验。 

对于 8 位的数据位,进行海明校验需要 4 个校验位。令数据位为D7,D6,D5,D4,D3,D2,D1,D0,校验位为P4,P3,P2,P1,形成的海明码为H12,H11,…,H3,H2,H1,则编码过程如下。

确定校验关系,如下表所示:

如果采用奇校验,则将各校验位的偶校验值取反即可。

注意: \oplus 符号表示异或操作

这个表是书上的一个表,大家可能看起来不太好理解,我总结了一个表:

1=2^{0}

2=2^{1}

3=2^{1}+2^{0}

4=2^{2}

5=2^{2}+2^{0}

6=2^{2}+2^{1}

7=2^{2}+2^{1}+2^{0}

8=2^{3}

9=2^{3}+2^{0}

10=2^{3}+2^{1}

11=2^{3}+2^{1}+2^{0}

12=2^{3}+2^{2}

对于这个表,从 1 到 12 都可以看作是 2 的几次幂的和,那么我们找出包含有相同次幂的组合 

以上六个式子包含有 2^{0},分为一组,对应的海明位分别是1,3,5,7,9,11(P1,D0,D1,D3,D4,D6),对应前面图中的P1校验

P1 = D0\oplus D1\oplus D3 \oplus D4 \oplus D6

以上六个式子包含有 2^{1},分为一组,对应的海明位分别是2,3,6,7,10,11(P2,D0,D1,D3,D5,D6),对应前面图中的P2校验

P2 = D0\oplus D2\oplus D3 \oplus D5 \oplus D6

以上六个式子包含有 2^{2},分为一组,对应的海明位分别是4,5,6,7,12(P3,D1,D2,D3,D7),对应前面图中的P3校验

P3 = D1\oplus D2\oplus D3 \oplus D7

以上六个式子包含有 2^{3},分为一组,对应的海明位分别是8,9,10,11,12(P4,D4,D5,D6,D7),对应前面图中的P4校验

P4 = D4\oplus D5\oplus D6 \oplus D7

这样经过第二步后,我们就得出了四个校验组。

第三步:检验错误,对使用海明编码的数据进行差错检测。

G1 = P1 \oplus D0 \oplus D1\oplus D3 \oplus D4 \oplus D6

G2 = P2 \oplus D0\oplus D2\oplus D3 \oplus D5 \oplus D6

G3 = P3 \oplus D1\oplus D2\oplus D3 \oplus D7

G4 =P4\oplus D4\oplus D5\oplus D6 \oplus D7

若采用偶校验,则 G1G2G3G4 全为 0 时表示接收到的数据无错误(奇校验应全为1)。当  G1G2G3G4 不全为 0 时说明发生了错误,G1G2G3G4的十进制值能够指出发生错误的位置,例如G1G2G3G4 = 1001,说明H9(D4)这个位置出现了差错,将其取反即可纠正错误。

再来看一个例题:

以上就是关于海明码的原理及相关计算,如有错误,欢迎指正!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/730986.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构复习】汉诺塔:快速回忆汉诺塔问题

题目 题解 众所周知这是一个递归问题( 我们只需要注意两点:①什么时候退出递归 ②怎么从n-1推出n ①什么时候退出递归:很明显啦,n1的时候,我们直接把A位置的唯一盘子移到C上,大功告成。 ②怎么从n-1推出n…

Vision Pro销售策略曝光,面罩/头带/屈光镜片加大零售难度

彭博社Mark Gurman再次发布了关于苹果Vision Pro的销售策略,以及零售方面的难题。 一、销售计划和策略 1,2024年初先在美国部分门店销售,仅线下购买,线上暂不开放。购买方式是先线上预约(可能要提供面部扫描图、眼镜…

Python 利用opencv识别某象旋转验证码,识别率达95%以上

本期介绍某象旋转验证码识别,识别的思想其实与上篇文章识别滑动还原验证码相似,也是借鉴过来的,但是旋转验证码更加复杂,实现起来稍加困难,下面来看一下,原始数据集和识别之后数据集。 原始数据集: 将圆图旋转成功之后的数据集: 注意:我这里仅仅抓取了几十张作为数据…

c++使用回调函数

前言 回调函数的使用场景&#xff0c;当内部逻辑不知道用户的类型时&#xff0c;让用户自己提供对应数据类型的函数。 代码 #include<iostream> using namespace std;/// <summary> /// 万能打印函数。用户调用 /// </summary> /// <param name"d…

操作系统第六章之进程同步

操作系统第六章之进程同步 参考资料来源竞争同步临界区问题标准解决方案Peterson solution 硬件同步TestAndSet指令Swap介绍 信号量SemaphoresCritical Section of n n n Processes 信号量的实现Semaphore Implementation死锁和饥饿 经典同步问题有限缓冲问题生产者进程的结构…

笔记2(DCL指令)

用处&#xff1a;用来管理数据库 用户&#xff0c;控制数据库的访问 权限 DCL – 用户管理 1.查询用户 use mysql; select * from user; 2.创建用户 create user 用户名主机名 identified by 密码; 例如&#xff1a; create user xiaojielocalhost identified by 4620; 创建…

可重入函数、volatile关键字、SIGCHLD信号

目录 一、可重入函数 二、volatile关键字 三、SIGCHLD信号 一、可重入函数 以一个链表头插为例子 main函数调用insert函数像一个链表head中插入节点node1&#xff0c;插入操作分为两步&#xff0c;刚做完第一步的时候因为硬件中断使进程切换到内核&#xff0c;再次回到用户…

Visual studio 2015下载安装以及缺包提示的处理方法

最近要加入的比赛团队需要用到Visual studio 2015&#xff0c;百度后找到很多资源&#xff0c;自己也转到了百度网盘。中英文都有&#xff0c;需要的可以下载。 链接&#xff1a;https://pan.baidu.com/s/12gpVwXfQxfdkXub-IwhWFw?pwds325 提取码&#xff1a;s325 --来自百…

linux安装交叉编译环境

1、安装系统自带的交叉编译环境 sudo apt install gcc-arm-linux-gnueabihf sudo apt install g-arm-linux-gnueabihf 2、选择特定交叉编译器版本 版本路径&#xff1a;Linaro Releases 当前选择版本&#xff1a;4.9 、64位的版本

ArcGIS栅格影像数据处理

ArcGIS栅格影像数据处理 文章目录 ArcGIS栅格影像数据处理1. 栅格影像数据坐标系转换2. 栅格数据16bit转8bit3. 栅格数据波段变换参考链接 1. 栅格影像数据坐标系转换 点击【ArcToolbox】>【数据管理工具】>【投影和变换】>【栅格】>【投影栅格】。 2. 栅格数据16…

Jetpack compose——深入了解recomposition的工作原理

一、compose怎么 实现响应式编程的 Jetpack Compose 是 Android 的现代 UI 工具包&#xff0c;它使用 Kotlin 语言的声明式 UI 模式来简化 UI 开发。在这种模式中&#xff0c;你只需描述 UI 应该如何根据应用的状态进行显示&#xff0c;而 Compose 会在状态发生变化时自动更新…

【Linux】oh-my-zsh终端配置

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍oh-my-zsh终端配置。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷路&am…

Spring Boot发送QQ邮件

Spring Boot发送QQ邮件 1. 创建Spring Boot项目2. 引入发邮件的starter3. 必要配置4. 编写邮件内容5. 测试其他&#xff1a; Spring Boot简单引入一个包就能轻松发邮件&#xff0c;仅需5分钟就能实现 1. 创建Spring Boot项目 略 2. 引入发邮件的starter <dependency>&l…

学习在外部Python脚本中运行Houdini的Python接口(hou模块)

0. 目标 学习在外部Python脚本&#xff08;而非Houdini编辑器内部&#xff09;使用 hou 。 主要参考Houdini官方文档 Command-Line Scripting 中的【Accessing hou from a Regular Python Shell】部分。我将要点记录在下&#xff1a; 1. 将Houdini的dll加入搜索路径 为了能…

FPGA实验五:信号发生器设计

目录 一、实验目的 二、设计要求 三、实验代码 1.代码原理分析 2.代码设计思路 3.IP核的设计与配置 四、实验结果及分析 1、引脚锁定 2、仿真波形及分析 &#xff08;1&#xff09;关于波形一些指标的介绍 &#xff08;2&#xff09;对波形转换功能的验证 &#xf…

【LeetCode】225. 用队列实现栈

225. 用队列实现栈&#xff08;简单&#xff09; 思路 要使用一个队列来实现栈的功能。 具体来说&#xff0c;实现了以下几个方法&#xff1a; push(int x)&#xff1a;将元素 x 入栈&#xff0c;即将元素 x 插入到队列的末尾。pop()&#xff1a;弹出栈顶元素&#xff0c;即将队…

空天遥感守护自然资源底线,擦亮生态底色

上期介绍了航天宏图采用“空天地”一体化监测监管手段&#xff0c;打造基于“SAR卫星耕地变化遥感智能解译”、 基于“遥感大模型的耕地分类技术”等智慧耕地保护解决方案&#xff0c;本篇文章主要讲述“遥感如何助力自然保护地监测与保护”和“如何助力山水林田湖草沙生态修复…

Spanner: Google的全球分布级数据库----论文摘要

Spanner中一个新奇的time api揭示了时钟的不确定性。该api及其实现对于支持外部一致性&#xff08;外部观察一致性&#xff09;以及一系列强力的特性至关重要&#xff0c;这些特性包括&#xff1a;对过去版本数据的无阻塞读&#xff08;对于历史数据的读不加锁&#xff0c;且不…

密码学入门——DES与AES

文章目录 参考书目一、编码与异或1.1 编码1.2 异或 二、DES与三重DES三、AES 参考书目 图解密码技术&#xff0c;第三版 一、编码与异或 1.1 编码 计算机的操作对象并不是文字&#xff0c;而是由0和1排列而成的比特序列。无论是文字、图像、声音、视频还是程序&#xff0c;…

短视频矩阵管理系统源码开发:视频批量剪辑,分发功能开发示例

短视频矩阵管理系统开发&#xff0c;首先对服务器要求&#xff1a; 源码所需服务器配置 1、规格&#xff1a;最低8核16G 2、硬盘&#xff1a;系统盘40-100G&#xff0c;数据盘不低于100G 3、带宽&#xff1a;10M 4、系统&#xff1a;CentOS7(务必选择7.*) 部署过程中&…