汉明码的学习笔记
自己的理解 帮助自己复习用的 写的可能会有错误
汉明码(Hamming Code )
汉明码(Hamming Code),是在电信领域的一种线性调试码,以发明者理查德·卫斯里·汉明的名字命名。汉明码在传输的消息流中插入验证码,当计算机存储或移动数据时,可能会产生数据位错误,以侦测并更正单一比特错误。由于汉明编码简单,它们被广泛应用于内存(RAM)。——百度百科
说人话 就是 我想发送一串二进制数据 例如 10010
但我又怕发送过程中出现意外就用检测码的形式保证不会出错,出错了也可以通过检测码查出哪位出错了因为二进制只有01,错了就能改正。
发送biubiubiu
我想发 10010
首先 根据公式 n位二进制位数 k位检测位数
算出k最小为4
也就是5位的二进制数据10010要插入4位检测码
但插入并不是直接放在数据最前或是最后
4位检测码是按照
位放入二进制数据中
二进制数据序号 | 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 |
就是序号顺序和检测码顺序得保持一致
而且写汉明码和姐汉明码方向应该一致(应该是对的我验证了一下就因为我看的一个教程 方向错了 我做的作业全错 呜呜呜 )
不过默认从左向右 别整那些骚的了