您的位置:首页 > 理论基础 > 计算机网络

【计算机网络实验一】海明码

2005-04-18 19:55 393 查看
1.海明码的概念
  海明码是一种可以纠正一位差错的编码。它是利用在信息位为k位,增加r位冗余位,构成一个n=k+r位的码字,然后用r个监督关系式产生的r个校正因子来区分无错和在码字中的n个不同位置的一位错。它必需满足以下关系式:
         2r>=n+1 或 2r>=k+r+1
  海明码的编码效率为:
            R=k/(k+r)
  式中 k为信息位位数
     r为增加冗余位位数 (这些是从网上抄的)
例3.已知:信息码为:" 1 1 0 0 1 1 0 0 " (k=8)
    求:海明码码字。
  解:1)把冗余码A、B、C、…,顺序插入信息码中,得海明码
      码字:" A B 1 C 1 0 0 D 1 1 0 0 "
      码位: 1 2 3 4 5 6 7 8 9 10 11 12
     其中A,B,C,D分别插于2k位(k=0,1,2,3)。码位分别为1,2,4,8。
    2)冗余码A,B,C,D的线性码位是:(相当于监督关系式)
      A->1,3,5,7,9,11;
      B->2,3,6,7,10,11;
      C->4,5,6,7,12;(注 5=4+1;6=4+2;7=4+2+1;12=8+4)
      D->8,9,10,11,12。
    3)把线性码位的值的偶校验作为冗余码的值(设冗余码初值为0):
      A=∑(0,1,1,0,1,0)=1
      B=∑(0,1,0,0,1,0)=0
      C=∑(0,1,0,0,0) =1
      D=∑(0,1,1,0,0) =0
    4)海明码为:"1 0 1 1 1 0 0 0 1 1 0 0"

海明码的接收。

例.已知:接收的码字为:"1 0 0 1 1 0 0 0 1 1 0 0"(k=8)
    求:发送端的信息码。
  解:1)设错误累加器(err)初值=0
    2)求出冗余码的偶校验和,并按码位累加到err中:
      A=∑(1,0,1,0,1,0)=1 err=err+20=1
      B=∑(0,0,0,0,1,0)=1 err=err+21=3
      C=∑(1,1,0,0,0) =0 err=err+0 =3
      D=∑(0,1,1,0,0) =0 err=err+0 =3
     由err≠0可知接收码字有错,
    3)码字的错误位置就是错误累加器(err)的值3。
    4)纠错--对码字的第3位值取反得正确码字:
      "1 0 1 1 1 0 0 0 1 1 0 0"
    5)把位于2k位的冗余码删除得信息码:"1 1 0 0 1 1 0 0"
2.编程实现海明码(c++)
下面这个程序实现的就是例子里头的那个东东,有点长,不过毕竟是写的第一个网络实验的程序。
# include <iostream.h>
# include <math.h>
void main()
{
int c[13];
int A,B,C,D;
int err=0;int k=0;
cout<<"Input the code... "<<endl;
for(int i=3;i<13;i++)
{
if(i==4||i==8)
i++;
cout<<"第"<<i<<"位:"<<endl;
cin>>c[i];
}
c[1]=abs((c[1]+c[3]+c[5]+c[7]+c[9]+c[11])%2);
c[2]=abs((c[2]+c[3]+c[6]+c[7]+c[10]+c[11])%2);
c[4]=abs((c[4]+c[5]+c[6]+c[7]+c[12])%2);
c[8]=abs((c[8]+c[9]+c[10]+c[11]+c[12])%2);
cout<<"生成的海明码为:";
for(int j=1;j<13;j++) cout<<c[j];
cout<<endl;
cout<<"现在是传输时间...请决定让这条海明码错哪一位"<<endl;
cout<<"错第几位?:";
cin>>k;
c[0]=1-c[k];
cout<<"原来为"<<c[k]<<",现已经更改为"<<c[0]<<endl;
c[k]=c[0];
c[1]=abs((c[1]+c[3]+c[5]+c[7]+c[9]+c[11])%2);
c[2]=abs((c[2]+c[3]+c[6]+c[7]+c[10]+c[11])%2);
c[4]=abs((c[4]+c[5]+c[6]+c[7]+c[12])%2);
c[8]=abs((c[8]+c[9]+c[10]+c[11]+c[12])%2);
cout<<"已经到达接收端,检查的结果为:";
A=c[1];
B=c[2];
C=c[4];
D=c[8];
cout<<"abcd:"<<A<<","<<B<<","<<C<<","<<D<<endl;
if(A==1) err=err+1;
if(B==1) err=err+2;
if(C==1) err=err+4;
if(D==1) err=err+8;
c[err]=1-c[err];
cout<<"第"<<err<<"位错了,纠正后的结果为:";
for(int m=1;m<13;m++) cout<<c[m];
cout<<endl;
cout<<"去掉纠错码后的结果为:";
for(i=3;i<13;i++)
{
if(i==4||i==8)
i++;
cout<<c[i];
}
}

运行的结果:



问题倒是蛮多的,首先就是不够简洁,不过那个模2除法真的把我搞晕了,不知道c++里头有没有简便的实现方法。
不知道有哪位仁兄可以帮忙改良一下
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: