汉明码
简介
“汉明码”是一种“错误纠正码”,可以用来检测并且纠正数据从发送端发往接收端中发生的错误。
能发现和能纠正一bit的错误,1bit以上可能无法发现或者纠正错误。
汉明码可以说是奇偶校验码的升级版,原理是基于奇偶校验码。
奇偶校验码
简单的一种,给每一个码字加一个校验位,若两数中有奇数位不同,则校验码就不同。
只能发现奇或偶数位的错误,不能纠错。
如ASCII码:第一位为校验位,奇校验,只有奇数个1则合法
原理
将原码以原码所在汉明码中位数的二进制数的某个位为1来分组。
对所有组进行奇偶校验,校验码放在组的第一位。
如果传输途中1bit出错,把所有组校验结果错误的标记为1,正确的标记为0,由于每组都对应一个汉明码位置的一个位,所以可以根据此来找到错误的位置,对其取反。
如:
数据:10101
汉明码位号十进制表示 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | … |
---|---|---|---|---|---|---|---|---|---|---|
汉明码位号二进制表示 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 | … |
数据/校验码 | 校验码 | 校验码 | 数据 | 校验码 | 数据 | 数据 | 数据 | 校验码 | 数据 | … |
汉明码 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | … |
汉明码位号二进制中符合2^i都是一个校验码也是一个组的校验码。
汉明码位号二进制表示中有多少个位就分多少个组,这里有4个位。
分组规则:哪位为’1‘就是哪组元素。
1号位为‘1’的都是第一组元素:
1->0001,3->0011,5->0101,7->0111,9->1001
2号位为’1‘的都是第一组元素
2->0010,3->0011,6->0110,7->0111
…
技巧
汉明码位数判断:
2^校验码 > 原码 + 校验码
校验码位置:2^i 。
校验码要使组中所有元素数据位1的个数为偶数
快速分组:
[组号~2^组号-1]为一块
2^组号为到下一块的距离(类似等差数列)
汉明码中位置 | 组号 | 元素位置 |
---|---|---|
1 | 1 | 1.3.5.7.9.11.13 |
2 | 2 | 2,3.6,7.10,11. |
4 | 3 | 4,5,6,7.12,13,14,15. |
8 | 4 | 8,9,10,11,12,13,14,15. |
快速计算
将原码中数据为一的位二进制表示,竖着排列
十进制 | 二进制 |
---|---|
3 | 0011 |
6 | 0110 |
9 | 1001 |
校验码 | 1100 |
第位的校验码对应低的组号。