学习笔记 - 汉明码

汉明码属于一种具备纠错功能的线性分组码。

线性分组码,是将信息序列按特定长度分组(设长度为\(k\)),每组信息位会相应生成一组由信息位与监督位共同构成的码字(设长度为\(n\),且\(n > k\)),各码字之间遵循线性关系。汉明码的纠错能力使其能够识别并修正传输、存储环节里出现的错误。

在数据传输时,受外界干扰影响,单个比特可能产生差错。汉明码借助添加的冗余监督位,依照特定规则精准判断出错比特位,进而完成纠正,确保信息恢复如初,宛如给数据披上一层“防护甲”,使其即便处于复杂环境,也能维持精准可靠,在通信、存储等众多领域发挥关键作用。

三重码

所谓“三重码”,恰如其字面含义,即重要之事重复三遍。就数据而言,一旦出现数据损坏状况,便可利用其他相关数据修复受损数据。只要出错数量在1个以内,对应的数据便可成功修复。

原始数据 0 0 0 0 1 1 1 1
发送数据 000 000 000 000 111 111 111 111
接收数据 000 001 010 100 111 110 101 011
还原数据 0 0 0 0 1 1 1 1

不过,要是出错地方超过2个,就无法修复了(尽管这种概率极低):

原始数据 0 0 0 0 1 1 1 1
发送数据 000 000 000 000 111 111 111 111
接收数据 011 101 110 111 100 010 001 000
还原数据 1 1 1 1 0 0 0 0

但数据出错概率很低,使用三重码需传输三次原始数据,致使传输效率下滑。既然如此,也可适当降低纠错频率。

奇偶校验码

奇偶校验码的工作原理是统计一段二进制数里“1”出现的频次。若这段数中“1”的数量为偶数,校验码是“0”;若为奇数,校验码则是“1”。以下是一个8位的简单示例:

原始数据 接收数据 校验码
0100 1010 0100 1010 1
0100 1010 0100 1000 1

在原始数据“0100 1010”中,“1”出现了3次(奇数),所以校验码为“1” 。但在第二个数据里,接收数据“0100 1000”中“1”仅出现2次(偶数),校验码本该是“0”,实际接收的却是“1”,由此可判断该数据有误。

不过,奇偶校验码仅能判断1个以内的错误。因为它仅能体现“1”出现次数的奇偶性,一旦出现2个错误,奇偶校验码就失效了。

依据奇偶校验码特性,还能通过行列定位错误位置。下面是一个16位的例子:

实际数据 校验码
0 1 0 0 1
1 0 1 0 0
0 1 0 0 1
1 0 0 0 1
校验码 0 0 1 0
错误数据 校验码
0 1 0 0 1
1 0 0 0 0
0 1 0 0 1
1 0 0 0 1
校验码 0 0 1 0

如此,能迅速锁定出错位置。但要是出现2个连续的错误,就没办法定位了:

错误数据 校验码
0 1 0 0 1
1 0 0 1 0
0 1 0 0 1
1 0 0 0 1
校验码 0 0 1 0

由于每行校验码均无误,所以难以定位。而且这种方式效率不高,16位数据需8个校验码。于是,查德·卫斯里·汉明发明了——汉明码。

汉明码

有一道知名智力谜题:16杯水中有1杯有毒,怎样用最少的化验次数找出有毒的那杯?

解题思路如下:随机选8杯化验,若有毒,有毒杯子就在这8杯里;若没毒,有毒杯子就在另外8杯之中。接着选4杯化验……如此这般化验4次,直至确定有毒的那一杯。概括来讲,就是错误若不在这一半,那必然在另一半。我们继续用16位数据举例:

原始数据 校验码
0100 1010 0100 1000 0
0100 1010 0100 1000 1
0100 1010 0100 1000 1
0100 1010 0100 1000 0

据此算出“0100 1010 0100 1000”的4位校验码是“0110”。

要是接收数据是“0100 1000 0100 1000”,其校验码是“0000”,与接收的校验码“0110”不匹配,表明接收数据有误。

第1个和第4个校验码无误,说明错误不在这些地方:
0100 1000 0100 1000

第2个和第3个校验码出错,意味着错误同时出现在第2个和第3个校验的位置:
0100 1000 0100 1000

综合上述分析,错误只会在:
0100 1000 0100 1000

所以,正确的数据应为:
0100 1010 0100 1000

然而,这种操作存在一个问题:第1位发生的错误无法检测出来。也就是说,4位校验码能够校验15位数据。此外,还面临一个难题:要是数据没错,但校验码出错,该如何处理?汉明的办法是把校验码与原始数据混合在一起:在11位数据中混入4位校验码。

位置 位置的2进制值 备注
1 0001 留空
2 0010 留空
3 0011 0
4 0100 留空
5 0101 1
6 0110 0
7 0111 0
8 1000 留空
9 1001 1
10 1010 0
11 1011 1
12 1100 0
13 1101 0
14 1110 1
15 1111 0

可以发现,留空位置的二进制值仅有1位是“1”。

计算校验码时,先算出位置二进制值第1位是“1”的奇偶校验码,例如位置“1001”、“1010”,填入第8位;接着算第2位是“1”的奇偶校验码,像位置“0101”、“1110”,填入第4位;再算第3位是“1”的奇偶校验码,如位置“0110”、“1010”,填入第2位;最后算第4位是“1”的奇偶校验码,比如位置“1001”、“1011”,填入第1位。

最终,我们会得到:

位置 位置的2进制值 备注
1 0001 1 留空
2 0010 0 留空
3 0011 0
4 0100 0 留空
5 0101 1
6 0110 0
7 0111 0
8 1000 1 留空
9 1001 1
10 1010 0
11 1011 1
12 1100 0
13 1101 0
14 1110 1
15 1111 0

要是第5位出错,第1位和第4位校验码会出错。从排列方式可知,要是数据出错,必然导致2个及以上校验码出错,因为数据位置的二进制值不止有1个“1”。若仅有1个校验码出错,那只能是校验码自身有问题。按上述方式,汉明码可纠正1位错误。那出现2位错误呢?可以设置第0位数来表示后面15位数的奇偶校验码:
0100 0100 1101 0010

当后面数据出现1位错误时,第0位能察觉;出现2位错误时,第0位察觉不出,但校验码能发现;如此,汉明码便拥有了纠正1位错误、察觉2位错误的能力。出现2位错误时,虽无法纠正,但能让对方重发消息来纠错。

要是出现三个错误呢?汉明码就检测不出来了。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习笔记 - 摩斯电码

摩斯电码由美国人塞缪尔莫尔斯等人发明,仅用“”(点)与“-”(划)两种符号,按不同排列组合来代表英文字母、数字和标点。起初应用于有线电报,后应用到无线电通信,曾长期担任关键角色。如今,虽因通信技术革新而不再主流,但在业余无线电爱好者群体中依旧流行,紧急救援时…

2024第一届Solar杯应急响应挑战赛WP

对于一个只学了2个月的小白来说这种比赛难度还是太高了,还要沉淀一下QAQ 内存取证-1 题目描述 题目文件:SERVER-2008-20241220-162057 请找到rdp连接的跳板地址 flag格式 flag{1.1.1.1} 先imageinfo然后netscan F:\CTF软件合集\Misc杂项\隐写工具\取证类\volatility\Volatili…

App信息收集

引子:上一章主要介绍了信息收集中的Web信息收集,包括要收集什么信息、该怎样去做等内容。而本章则简单介绍一下当目标为App时该如何进行信息收集。由于本篇章为信息收集篇,因此很多内容笔者并没有深究(ps:其实是深究不明白),或许等一轮学完后再回头看时会明白很多吧。免…

基于PSO粒子群优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真

1.算法运行效果图预览 (完整程序运行后无水印)PSO优化过程: PSO优化前后,模型训练对比: 数据预测对比: 误差回归对比: 2.算法运行软件版本 matlab2022a3.部分核心程序 (完整版代码包含详细中文注释和操作步骤视频)LR = g1(1); NN1 = floor(g1…

软件工程我依然爱你

用一个词总结软工实践课程——Never forget!!!😚😚😚 前言现在是2024年12月27号下午4点,是我考完软件工程课程的四小时,也是我软工实践结束的第27天。我竟莫名对软件工程有点不舍,特别是我们倾注大量心血的项目——福小研,我愿称之为我心里最好的项目之一,或许它…

2024省选联测1

2024省选联测1题目来源: 2024省选联测1 \(T1\) HZTG5808. interval \(40pts\)原题: QOJ 1173. Knowledge Is..考虑按照左端点升序排序后反悔贪心。分别维护已经匹配的区间对和未被匹配的区间,若当前区间 \(a\) 可以和前面剩余的未被匹配的区间匹配则直接匹配;否则尝试找到一…

2024-2025-1 20241407《计算机基础与程序设计》第十四周学习总结

作业信息这个作业属于哪个课程 2024-2025-1计算机基础与程序设计这个作业要求在哪里 2024-2025-1计算机基础与程序设计第十四周作业这个作业的目标 学习二进制文件和文本文件,文件的打开和关闭,顺序读写与随机读写,标准输入和输出及其重定向作业正文 本博客教材学习内容总结…

GraphMAE2(解码增强型掩码自监督图学习器)

GraphMAE2: A Decoding-Enhanced Masked Self-Supervised Graph Learner 解码增强型掩码自监督图学习器 背景 ​ 近年来,自监督学习(Self-supervised Learning,SSL)得到了广泛的探索,特别是生成式自监督学习在自然语言处理以及其他人工智能领域已经取得了新兴的成功,像…

PTA第7~8次大作业分析及总结

一、前言 本次Blog为第七~八次大作业的总结。两次大作业主要考察抽象类及继承方面的相关内容,是在第六次大作业基础上的进一步升级,难度大幅提升,由于前面的作业我没有很好地完成,这两次大作业也没有拿到好成绩,这也算是提醒我:在进行一个设计时要提前为后续更加预留空间…

python3网络爬虫开发实战-第2版PDF免费下载

本书介绍了如何利用 Python 3 开发网络爬虫。本书为第 2 版,相比于第 1 版,为每个知识点的实战项目配备了针对性的练习平台,避免了案例过期的问题。另外,主要增加了异步爬虫、JavaScript 逆向、App 逆向、页面智能解析、深度学习识别验证码、Kubernetes 运维及部署等知识点…

Java大作业总结

Java大作业总结 目录Java大作业总结一.前言第七次大作业1.设计与分析2.踩坑心得(一)电阻值处理(二)设备状态更新顺序3.改进建议(一)错误处理与异常机制(二)性能优化(三)代码结构调整第八次大作业1.设计与分析2.踩坑心得3.改进建议期末总结 一.前言 这2次大作业都是前…

题目集 7 - 8 总结性 Blog

一、前言 在本学期的学习旅程中,题目集 7 和题目集 8 犹如两座重要的里程碑,引领我们在编程的道路上不断探索与前行。这两个题目集总计包含了2道题目,它们犹如一把把钥匙,开启了面向对象编程世界的大门,引领我们逐步深入其中,领略其复杂与精妙之处。题目集 7 宛如基石,着…