汉明码的学习笔记

自己的理解 帮助自己复习用的 写的可能会有错误

汉明码(Hamming Code )

汉明码(Hamming Code),是在电信领域的一种线性调试码,以发明者理查德·卫斯里·汉明的名字命名。汉明码在传输的消息流中插入验证码,当计算机存储或移动数据时,可能会产生数据位错误,以侦测并更正单一比特错误。由于汉明编码简单,它们被广泛应用于内存(RAM)。——百度百科

说人话 就是 我想发送一串二进制数据 例如 10010
但我又怕发送过程中出现意外就用检测码的形式保证不会出错,出错了也可以通过检测码查出哪位出错了因为二进制只有01,错了就能改正。

发送biubiubiu

我想发 10010
首先 根据公式2k>=n+k+12^{k}>=n+k+1 n位二进制位数 k位检测位数
算出k最小为4
也就是5位的二进制数据10010要插入4位检测码
但插入并不是直接放在数据最前或是最后
4位检测码是按照2i2^{i}
位放入二进制数据中

二进制数据序号 1 2 3 4 5 6 7 8 9
序号用二进制表示 0001 0010 0011 0100 0101 0110 0111 1000 1001
数据串 C1 C2 1 C3 0 0 1 C4 0

根据序号的二进制进行分组
满足 XXX1 的位第一组

序号 1 3 5 7 9
数据串 C1 1 0 1 0

满足 XX1X 的为第二组

序号 2 3 6 7
数据串 C2 1 0 1

满足 X1XX 的为第三组

序号 4 5 6 7
数据串 C3 0 0 1

满足1XXX的为第四组

序号 8 9
数据串 C4 0

Ci为第几位检测码 可以发现每组数据串都有一位检测码 分别对其进行偶校验 就可以得出检测码了 从而得到最终的汉明码
第一组 C1为0
第二组 C2为0
第三组 C3为1
第四组 C4为0
所以最后的海明码为 001100100 然后就可以biubiubiu 发过去了

接收duangduangduang

接收一串海明码怎么查错及提取有效数据嘞
还是以上面发送的为例 001 100 100在发送过程中第6位错了变成了001 101 100
看我操作就行了
接收duangduangduang
分组进行偶校验 满足给0 不满足给1

二进制数据序号 1 2 3 4 5 6 7 8 9
序号用二进制表示 0001 0010 0011 0100 0101 0110 0111 1000 1001
数据串 0 0 1 1 0 1 1 0 0

满足 XXX1 的位第一组 满足偶校验 给0

序号 1 3 5 7 9
数据串 0 1 0 1 0

满足 XX1X 的为第二组 不满足偶校验 给1

序号 2 3 6 7
数据串 0 1 1 1

满足 X1XX 的为第三组 不满足偶校验 给1

序号 4 5 6 7
数据串 1 0 1 1

满足1XXX的为第四组 满足偶校验 给0

序号 8 9
数据串 0 0

按照组数从大到小列出为 0110 卧槽 正好就是6的二进制表示
就是第6位错了 改过来就得了 001 100 100 ✔
有效信息的话就是 去掉第1,2,4,8位的检验码
为 10010√
呐呐呐 就结束了

奇偶检验

添加一位检测位,使得二进制数据中满足奇偶原则

配偶原则 就是检测二进制数据中‘1’的个数如果为奇数个,检测位就为‘1’使得满足二进制数据中‘1’的个数满足偶数个,如果个数为偶数,检测位则为‘0’ 这就是配偶原则也叫偶校验

配奇原则就是检测二进制数据中‘1’的个数 如果为奇数,检测位为‘0’,如果为偶数,检测位为‘1’以此满足配奇数原则,也叫奇校验

为啥子呢

会做了 我们来搞搞原理
汉明码的学习笔记
一串数据 1 2 3 4 5 6 7
分为三组
第一组 1 2 3 4
第二组 2 3 5 6
第三组 3 4 6 7
7个数中其中有一个是错的
我们还可以知道三个组有哪些是全对的 那些是错的
我们就能判断出 哪个数错了 神不神奇wow
eg.
第一组错了 ,第二三组对了 看图 就能知道 1是错的
第一二错了 第三组对了 看图得知 2是错的

简单的原理就是这个原理
我也说不清
自己体会
那就这样吧
写博客号累 写一上午了
我要去打csgo了
我要继续去学习了

其他一些想说的

汉明码 默认只错一位
汉明码 顺序的话可以从右向左 也就是可以

二进制数据序号 9 8 7 6 5 4 3 2 1
数据串 C4 C3 C2 C1

就是序号顺序和检测码顺序得保持一致
而且写汉明码和姐汉明码方向应该一致(应该是对的我验证了一下就因为我看的一个教程 方向错了 我做的作业全错 呜呜呜
不过默认从左向右 别整那些骚的了