海明校验码

1.确定位数

假定校验数据位数为n,检验位为k,则故障字也为k位。k位的故障字能表示 2 k 2^k 2k种。假定传送的数据最多只有一位出错。因此共有 1 + n + k 1+n+k 1+n+k[1:无错、n:数据位出错、k:校验位出错],则n和k必须满足下列关系: 2 k > = 1 + n + k 2^k>=1+n+k 2k>=1+n+k

2.检验码生成

假定一个8位的数据 M = M 8 M 7 M 6 M 5 M 4 M 3 M 2 M 1 M=M_8M_7M_6M_5M_4M_3M_2M_1 M=M8M7M6M5M4M3M2M1,算出其校验位为4位 P = P 4 P 3 P 2 P 1 P=P_4P_3P_2P_1 P=P4P3P2P1。根据以下规则:

  • 故障字为0000时表示没有错误
  • 故障字为0001、0010、0100、1000时分别表示 P 1 P_1 P1 P 2 P_2 P2 P 3 P_3 P3 P 4 P_4 P4出错
  • 剩余的情况表示各位数据位发生出错
    将n位数据和k位校验码形成的12位码字排成下列形式: M 8 M 7 M 6 M 5 P 4 M 4 M 3 M 2 P 3 M 1 P 2 P 1 M_8M_7M_6M_5P_4M_4M_3M_2P_3M_1P_2P_1 M8M7M6M5P4M4M3M2P3M1P2P1这12个码字的位置分别对应 1100 、 1011 、 . . . 、 0001 1100、1011、...、0001 11001011...0001
    在这里插入图片描述
    接下来开始生成故障字:
    P 1 = M 1 ∣ M 2 ∣ M 4 ∣ M 5 ∣ M 7 ( 选取所有位置与 P 1 位置与运算不为 0 的数据位异或起来 ) P_1=M_1|M_2|M_4|M_5|M_7(选取所有位置与P_1位置与运算不为0的数据位异或起来) P1=M1M2M4M5M7(选取所有位置与P1位置与运算不为0的数据位异或起来) P 2 = M 1 ∣ M 3 ∣ M 4 ∣ M 6 ∣ M 7 ( 选取所有位置与 P 2 位置与运算不为 0 的数据位异或起来 ) P_2=M_1|M_3|M_4|M_6|M_7(选取所有位置与P_2位置与运算不为0的数据位异或起来) P2=M1M3M4M6M7(选取所有位置与P2位置与运算不为0的数据位异或起来) P 3 = M 2 ∣ M 3 ∣ M 4 ∣ M 8 ( 选取所有位置与 P 3 位置与运算不为 0 的数据位异或起来 ) P_3=M_2|M_3|M_4|M_8(选取所有位置与P_3位置与运算不为0的数据位异或起来) P3=M2M3M4M8(选取所有位置与P3位置与运算不为0的数据位异或起来) P 4 = M 5 ∣ M 6 ∣ M 7 ∣ M 8 ( 选取所有位置与 P 4 位置与运算不为 0 的数据位异或起来 ) P_4=M_5|M_6|M_7|M_8(选取所有位置与P_4位置与运算不为0的数据位异或起来) P4=M5M6M7M8(选取所有位置与P4位置与运算不为0的数据位异或起来)生成完之后,将 P 1 P_1 P1 P 4 P_4 P4以及 M 1 M_1 M1 M 8 M_8 M8填入12位码字里。然后一起进行传输。

3.检错和纠错

接收方将12位码字接收到之后将8位数据和4位检验码分离出来,我们令接收到的8位数据为 M ′ = M 8 ′ M 7 ′ M 6 ′ M 5 ′ M 4 ′ M 3 ′ M 2 ′ M 1 ′ M^{'}=M_8^{'}M_7^{'}M_6^{'}M_5^{'}M_4^{'}M_3^{'}M_2^{'}M_1^{'} M=M8M7M6M5M4M3M2M1;令接收到的4位检验码为 P ′ ′ = P 1 ′ ′ P 2 ′ ′ P 3 ′ ′ P 4 ′ ′ P^{''}=P_1^{''}P_2^{''}P_3^{''}P_4^{''} P′′=P1′′P2′′P3′′P4′′;利用接收到的8位数据 M M M根据上面生成故障字的做法算 P ′ P^{'} P P 1 ′ = M 1 ′ ∣ M 2 ′ ∣ M 4 ′ ∣ M 5 ′ ∣ M 7 ′ P_1^{'}=M_1^{'}|M_2^{'}|M_4^{'}|M_5^{'}|M_7^{'} P1=M1M2M4M5M7 P 2 ′ = M 1 ′ ∣ M 3 ′ ∣ M 4 ′ ∣ M 6 ′ ∣ M 7 ′ P_2^{'}=M_1^{'}|M_3^{'}|M_4^{'}|M_6^{'}|M_7^{'} P2=M1M3M4M6M7 P 3 ′ = M 2 ′ ∣ M 3 ′ ∣ M 4 ′ ∣ M 8 ′ P_3^{'}=M_2^{'}|M_3^{'}|M_4^{'}|M_8^{'} P3=M2M3M4M8 P 4 ′ = M 5 ′ ∣ M 6 ′ ∣ M 7 ′ ∣ M 8 ′ P_4^{'}=M_5^{'}|M_6^{'}|M_7^{'}|M_8^{'} P4=M5M6M7M8。然后将 P ′ P^{'} P P ′ ′ P^{''} P′′逐位异或。异或的结果和结论如下:

  • 如果结果=0000,那么说明传输数据无误
  • 如果结果=0001、0010、0100、1000,那么说明检验位有误,可以不用管
  • 剩下的情况都是数据位出错,这种情况下,异或结果等于出错的码字的位置,可以将异或结果查看排列好的12位码字排列表即可找到哪个数据位发生了错误,直接将这个数据位的数值取反即可纠正。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值