【计算机网络实验一】海明码
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++里头有没有简便的实现方法。
不知道有哪位仁兄可以帮忙改良一下
海明码是一种可以纠正一位差错的编码。它是利用在信息位为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++里头有没有简便的实现方法。
不知道有哪位仁兄可以帮忙改良一下
相关文章推荐
- 计算机网络实验三 :CRC 校验 [17/11/08]
- 计算机网络攻击实验之-DDOS攻击
- 计算机网络实验【2】
- 计算机网络实验之路由器配置(子网划分)
- 计算机网络实验
- 【转载】海明码求解公式规律(转载自计算机网络高分笔记)
- 计算机网络安全实验总结 本部分主要包括计算机网络操作系统的配置,网络扫描,网络监听,网络入侵。
- 计算机网络实验ns2实验
- 计算机网络之TCP实验(wireshark版)
- 计算机网络综合基础实验操作
- 基于虚拟机环境的计算机网络安全访问控制系统的实验(1)
- 计算机网络原理实验一--网线的制作
- 【计算机网络实验二】crc编码(c++)实现
- 计算机网络实验二 CDMA 编码 [17/10/25]
- 『转载』海明码求解公式规律(转载自计算机网络高分笔记)
- 计算机网络实验报告
- 【计算机网络】VLAN划分及Trunk配置实验
- 海明码求解公式规律(转载自计算机网络高分笔记)
- 计算机网络实验rdt实验
- 计算机网络原理实验报告(一)