计算机网络中数据链路层编码纠错编码 --- 海明码

1 概述

首先, 海明码是计算机网络中数据链路层的针对位错提出的一种纠错编码方式.

海明码可以发现双比特错, 但纠正单比特错.

工作原理(简单解释): 牵一发动全身

2 工作流程

2.1 确定校验码位数r

海明不等式:

2^{r} \geq k + r + 1

其中r为冗余信息位数, k为信息位数

 如果给定要发送的数据, 就可以根据海明不等式确定出要添加的校验码的最小位数r

举例:

假如要发送的数据为101101, 那么数据的位数k为6, 那么满足不等式的最小r为4, 也就是说D = 101101的海明码应该有6 + 4 = 10位, 其中原数据有6位, 校验码有4位.

2.2 确定校验码和数据的位置

还是用上述例子说明:

当我们确定了6位数据101101需要添加4位校验位之后, 也就是说最终要发送的海明码有10位, 那么这10位具体哪位应该是校验码哪位应该是原本的数据码, 应该遵循以下原则:

  • 每个校验码应该放置在最终海明码的2的整数次幂的位置

以例题为例, 因为有四位校验码, 所以四个校验码码位应分别位于最终海明码的第2^{0}, 2^{1}, 2^{2}, 2^{3}, 也就是第1, 2, 4, 8个位置如下图:

剩下的位置按照原数据的顺序填入: 

2.3 求出校验码的值

首先标出海明码的每个数据位的位数所对应的二进制表示:

 然后就需要求出校验码P_{1}, P_{2}, P_{3}, P_{4}对应的值了, 在求每个校验码的值之前需要清楚一个原则:

每位校验码(P_{1}, P_{2}, P_{3}, P_{4})码位(1, 2, 4, 8)对应的位数的二进制(0001, 0010, 0100, 1000)表示中只有一个1(因为根据校验码位置确定的原则, P_{1}, P_{2}, P_{3}, P_{4}的位数分别为2^{0}, 2^{1}, 2^{2}, 2^{3}, 其二进制表示分别为0001, 0010, 0100, 1000), 那么海明码的每一位(P_{1}, P_{2}, D_{1}, P_{3}, D_{2}, D_{3}, D_{4}, P_{4}, D_{5}, D_{6})对应码位(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)的二进制表示(0001, 0010, 0011, 0100, 0101, 0110, 0111, 1000, 1001, 1010)中与校验码(P_{1}, P_{2}, P_{3}, P_{4})码位(1, 2, 4, 8)的二进制表示(0001, 0010, 0100, 1000)的1的位置(P_{1}, P_{2}, P_{3}, P_{4}分别为1, 2, 3, 4)同为1的所有码(海明码码位的二进制表示在P_{1}的海明码码位的二进制为1的位置同为1的码位有0001, 0011, 0101, 0111, 1001, 对应的码为P_{1}, D_{1}, D_{2}, D_{4}, D_{5}, 可以发现每一个校验码不会对应另一个校验码, 这是因为四个校验码的海明码码位的二进制表示分别为0001, 0010, 0100, 1000, 其1位置只有1个, 分别是第1, 2, 3, 4位, 所以不会出现重合情况, 同理P_{2}对应P_{2}, D_{1}, D_{3}, D_{4}, D_{6}P_{3}对应P_{3}, D_{2}, D_{3}, D_{4}P_{4}对应P_{4}, D_{5}, D_{6})的码值的抑或运算应为0(假设P_{1}, P_{2}, P_{3}, P_{4}的码值分别为x_{1}, x_{2}, x_{3}, x_{4}, 那么应有P_{1}, D_{1}, D_{2}, D_{4}, D_{5}码值的抑或运算为0, 也就是x_{1}\oplus 1 \oplus 0 \oplus 1 \oplus 0 = 0, 也就是x_{1} = 0, 即校验码位P_{1}的码值为0, 同理得出P_{2}, P_{3}, P_{4}的码值分别为0, 0, 1)

得到校验码P_{1}, P_{2}, P_{3}, P_{4}的值分别为0, 0, 0, 1, 如图:

 也就是说数据101101对应的海明码是0010011101

2.4 检错并纠错

  1. 在上一步中, 数据101101对应的海明码是0010011101, 于是传输端传送0010011101至接收端, 假设接收端收到的码第五位发生了错误, 即收到了0010111101:
  2. 接收端在进行检测的过程中, 就是让所有的位进行抑或运算. 先拿出所有的码位P_{1}, P_{2}, P_{3}, P_{4}为1, 2, 4, 8, 二进制表示为0001, 0010, 0100, 1000, 然后找到对应的要进行抑或运算的数据码位, 即P_{1}对应的P_{1}, D_{1}, D_{2}, D_{4}, D_{5}P_{2}对应的P_{2}, D_{1}, D_{3}, D_{4}, D_{6}P_{3}对应的P_{3}, D_{2}, D_{3}, D_{4}P_{4}对应的P_{4}, D_{5}, D_{6}, 用其码值进行抑或运算, 可以得到: P_{1}: 0\oplus 1 \oplus 1 \oplus 1 \oplus 0 = 1P_{2}: 0\oplus 1 \oplus 1 \oplus 1 \oplus 1 = 0P_{3}: 0\oplus 1 \oplus 1 \oplus 1 = 1P_{4}: 1\oplus 0\oplus 1 = 0, 把收到的海明码中P_{1}, P_{2}, P_{3}, P_{4}对应的所有码值的抑或结果, 按照P_{4}, P_{3}, P_{2}, P_{1}写, 也就是0101, 这个二进制值所对应的位, 也就是5, 也就是我们需要的出错位
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值