当前位置: 首页 > article >正文

海明码的认识理解与延伸

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)

1. 海明码的认识

海明码是一个不错的监测纠正算法,能够检测出纠正一位传输错误,提高数据传输的可靠性。
例如:
传输8bits内容,可以采用4bit的附加位数bits,来监测纠正8bit中,某一位传输的跳变。
其中一个问题,这附加的4bit如果有问题,能够监测出来吗?也可以的,这块参考海明码的算法实现特点就可以。
再附加一个问题,8bits需要4bits附加位数是怎么算出来的呢,这个参考公式:
传输位数N + 附加位数K + 1 <= 2的K次方
对于4bit附加位(K=4),最多可以附加到多长的传输位呢:2的4次方 - 4 - 1 = 16 - 4 - 1 = 11bits

附加,从deepseek找到的海明码的特点包括:
错误检测与纠正:能够检测出两位错误并纠正一位错误,提高数据传输的可靠性。
冗余位:通过添加校验位来实现错误检测和纠正,增加了额外的数据开销。
高效性:相对于其他纠错码,海明码在纠错能力和数据开销之间提供了良好的平衡。
简单实现:编码和解码过程相对简单,易于硬件实现。
广泛应用:常用于计算机内存、通信系统等需要高可靠性的领域。

2. 海明码算法-浅识

关于海明码算法,它的检测特点类似于:数据范围与位数的关系。

例如:
一个字节的bit位数是8位;
一个字节的数据范围是2的8次方,表达[0, 127);
能够看到8bits的位数表达范围2的8次方,9bits时就是2的9次方,10bits时就是2的10次方,比例看起来非常高效。

海明码的特点就类似于这个特点,利用位数长度,也即比特数作为检查的个数;
来检查纠正bits对应数据范围的数据,所出现的1位传输错误。

3. 海明码算法-详解

海明码的监测特点是基于数据的位特点形成的,每个校验位监测:位置值里某一位为1的值。
假如校验255个位置数目,位置大小占8比特,
第一个校验bit1为1的位置,
第二个校验bit2为1的位置,
第三个校验bit3为1的位置,
以此类推,第八个校验bit8为1的位置;

因为位置数目是连续的,每个bit为0的数目和为1的数目各占一半,也就是每个校验位校验一半位置上的数据。
每个校验位,对符合位置要求的一半数据做位运算,做异或运算。
因为每个校验位,都拿出筛选出的一半数据校验,也就是每个校验位,基于校验结果核对的情况,都可以校验出,数据在这一半里面,还是在另一半里面

校验位放置的也是经过特殊设计的,分别放在对应位置上。
2的0次方,位置1
2的1次方,位置2
2的2次方,位置4
2的3次方,位置8
2的4次方,位置16
2的5次方,位置32
2的6次方,位置64
2的7次方,位置128

校验码计算下来,拼装包之后,发送给对方,对方基于校验规则反算校验码结果;
一旦某一位的校验码出了错误,意味着,位置数字中,该bit位为1的,出现了错误;
把所有校验位出错的找出来,就可以得出出错的位置了。
例如:第一位的校验码出错了,第八位的校验码出错了。
那数据出错的位数位置位于:0b1000 0001,也就是这个位置的bit被反转了,纠正时,求逆即可。
因为只有这个位置0b1000 0001的bit被反转了,才能造成第一位校验码出错,才能造成第八位校验码出错,而其它位校验码不出错。

是否会存在某一位校验码出错的情况?这种情况表现是什么?
如果一个校验码出错,其它校验码是不受影响的,表现就是只有一个校验码异常。例如第三个校验码出错。
位置:0b0000 0100 正好也就是放第三个校验码的位置。

校验项的位置例子
例如:传输数据与校验码数据总个数范围内,数量少于256,占用8bits校验码;
则这8个校验码分别校验哪些项呢
校验码1:位置的第1bit位为1,包括[1, 3, 5, 7, 9, 11, 13…]
1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93,…

校验码2:位置的第2bit位为1, 包括[2-3, 6-7, 10-11, 14-15, 18-19, 22-23…]
2, 3, 6, 7, 10, 11, 14, 15, 18, 19, 22, 23, 26, 27, 30, 31, 34, 35, 38, 39,…

校验码3:位置的第3bit位为1, 包括[4-7, 12-15, 20-23, 28-31, 36-39, 44-47…]
4, 5, 6, 7,
12, 13, 14, 15,
20, 21, 22, 23,
28, 29, 30, 31,
36, 37, 38, 39,
44, 45, 46, 47,…

校验码4:位置的第4bit位为1, 包括[8-15, 24-31, 40-47, 56-63, 72-79, 88-95…]
8, 9, 10, 11, 12, 13, 14, 15,
24, 25, 26, 27, 28, 29, 30, 31,
40, 41, 42, 43, 44, 45, 46, 47,
56, 57, 58, 59, 60, 61, 62, 63,
72, 73, 74, 75, 76, 77, 78, 79,
88, 89, 90, 91, 92, 93, 94, 95,…

校验码5:位置的第5bit位为1, 包括[16-31, 48-63, 80-95, 112-127, 144-159, 176-191…]
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,…

校验码6:位置的第6bit位为1, 包括[32-63, 96-127, 160-191, 224-255]
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255.

校验码7:位置的第7bit位为1, 包括[64-127,192-255]
64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,
224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255.

校验码8:位置的第8bit位为1, 包括[128-255]
128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,
224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255.

4. 海明码算法延伸-十进制的角度理解海明码

从十进制的角度理解海明码,就更容易被理解了;因为我们用十进制比较多,思维上更天然的理解十进制的情况。

对于百位以内数来说,我们可以用二位来表达,个位、十位;
二个位能表达100个数字位置,比率比二进制又高了许多;
对于两位数校验来说,我们分成个位为1-9分别校验,十位为1-9分别校验,形成9+9=18个校验结果。

个位过滤校验9个:
个位上为1的数校验;包含1,11,21,31,41,51,61,71,81,91,个数为10;

个位上为9的数校验;包含9,19,29,39,49,59,69,79,89,99,个数为10;

十位过滤校验9个:
十位上为1的数校验;包含10,11,12,13,14,15,16,17,18,19,个数为10;

十位上为9的数校验;包含90,91,92,93,94,95,96,97,98,99,个数为10;

对于校验结果,如果我们知道了:
个位数为5的校验结果,反向校验时出现了校验错误;
十位数为8的的校验结果,反向校验时出现了校验错误;
那么我们就可以直接映射到,第58个位置出现了错误;
如果映射到横轴纵轴情况,横轴作为个位校验项,纵轴作为十位校验项,两个校验点交叉,就找到了出错项,锁定了出错项。

另外对于校验项放置的位置,也应特殊布置,用于检查校验码出错情况。
个位的校验码放在1-9位置,如果仅有这几个校验码出错,而无十位校验码出错的话,就可以把十位认为是0,识别到个位校验码出错位置。
十位的校验码放在10,20,30,40,50,60,70,80,90位置,当无个位校验码出错的时候,就可以把个位认为是0,识别到是十位校验码出错,直接识别到到位置。

海明码能够识别1位的错误,基于海明码特点应用到十进制上,也可以在这个过程种明显的体现出来。

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)


http://www.kler.cn/a/541661.html

相关文章:

  • 【算法学习】拓扑排序(Topological Sorting)
  • 「vue3-element-admin」告别 vite-plugin-svg-icons!用 @unocss/preset-icons 加载本地 SVG 图标
  • 表单与交互:HTML表单标签全面解析
  • 尝试一下,交互式的三维计算python库,py3d
  • 嵌入式linux系统中VIM编辑工具用法与GCC参数详解
  • apache-poi导出excel数据
  • 【算法解析】(2)分治算法:归并排序和快速排序
  • Unity3D Shader 简析:变体与缓存详解
  • RabbitMQ学习—day2—安装
  • 2025年前端面试,性能相关的面试题汇总
  • FFMPEG3.0 增加RTSP拉取PCM音频流功能
  • Elasticsearch 7 集群搭建问题排查:常见故障解决方案与优化技巧
  • macbook键盘进残渣,按键难回弹的简单处理方法
  • web3是什么,最简单的介绍
  • vue3学习之待办事项列表(Todo List)
  • 支持向量机原理
  • 如何在Node.js中使用中间件处理请求
  • 后盾人JS -- 模块化开发
  • 小游戏源码开发之可跨app软件对接是如何设计和开发的
  • Flutter_学习记录_基本组件的使用记录_2
  • 后盾人JS -- 异步编程,宏任务与微任务
  • HTML之JavaScript对象声明
  • MySQL下载过程
  • Flink内存配置和优化
  • 五十天精通硬件设计第27天-时域频域知识
  • Django中select_related 的作用