📄 codeerrordetecting.cpp
字号:
#include<iostream>
#include<math.h>
#include<string.h>
#include<time.h>
using namespace std;
const int N=100; //编码最大允许长度
int source[N]={0},hm[N]={0},crc[N]={0},g[N]={0};
char s[N];
int Comp_Length(int a) //求海明码的长度r
{
for(int i=1;;i++)
if(a+i+1<=pow(2,i))
return i;
}
int Insert(int a,int m) //在原数字序列中插入海明码
{
int i;
/*for(i=0;i<m;i++)
cout<<source[i];
cout<<"\t";*/
for(i=m-1;i>=a-1;i--)
source[i+1]=source[i];
source[a-1]=2;
/*for(i=0;i<m;i++)
cout<<source[i];
cout<<endl;*/
return m+1;
}
void HmCreate(int r,int m) //生成海明码
{
int i,j,l,temp[N];
for(i=0;i<r;i++) //初始化hm
hm[i]=0;
for(i=0;i<m;i++)
if(source[i]==1)
{
l=r-1;
j=i+1;
do //将下标转化为二进制数
{
temp[l--]=j%2;
j=j/2;
}while(j);
/*for(;l>=0;l--)
temp[l]=0;
for(l=0;l<r;l++)
cout<<temp[l];
cout<<"\t";*/
for(l=0;l<r;l++)
hm[l]=(hm[l]+temp[l])%2;
}
//cout<<endl;
}
int Convert(int r,int m) //确定出错的比特位
{
int i,result=0;
for(i=0;i<r;i++)
result+=hm[i]*pow(2,r-i-1);
return result;
}
void Haiming(int m) //海明码纠错主程序
{
int i,r,label;
for(i=0;i<N&&source[i]!=2;i++)
r=Comp_Length(m);
for(i=0;i<=r-1;i++)
m=Insert(pow(2,i),m);
HmCreate(r,m);
/*for(i=0;i<r;i++)
cout<<hm[i];
cout<<endl;
for(i=0;i<m;i++)
cout<<source[i];
cout<<endl;*/
for(i=0;i<r;i++)
{
int j=pow(2,r-i-1)-1;
source[j]=hm[i];
}
cout<<"海明编码后发送的信息为:\n";
for(i=0;i<m;i++)
cout<<source[i];
cout<<endl;
for(i=0;i<3000000;i++) //显示格式
if(i%100000==0)
cout<<".";
cout<<"数据传送中";
for(i=0;i<3000000;i++)
if(i%100000==0)
cout<<".";
cout<<endl;
srand(time(NULL));
label=rand()%(m+1);
if(label!=m)
source[label]=(source[label]+1)%2;
cout<<"收到信息为:\n";
for(i=0;i<m;i++)
cout<<source[i];
cout<<endl;
HmCreate(r,m);
if(Convert(r,m))
cout<<"第"<<Convert(r,m)<<"位传送出错\n";
else
cout<<"传输正确\n";
}
int Find(int temp[N],int m) //返回被减数中第一个不为0的比特位的下标
{
int i;
for(i=0;i<m;i++)
if(temp[i])
break;
return i;
}
void CRCCreate(int m,int G) //生成CRC码检错主程序
{
int j,i;
j=0;
for(i=0;i<m;i++)
crc[i]=source[i];
while(m-j>=G)
{
for(i=0;i<G;i++)
{
crc[j]=(crc[j]+g[i])%2;
j=j+1;
}
j=Find(crc,m);
//cout<<j;
}
}
void CRC(int m) //CRC码检错主程序
{
int option,i,label,G;
cout<<"请选择CRC码位数,1代表8位,2代表12位,3代表16位:\n";
cin>>option;
switch(option)
{
case 1:
G=9;
for(i=0;i<G;i++)
if(i==0||i==6||i==7||i==8)
g[i]=1;
break;
case 2:
G=13;
for(i=0;i<G;i++)
if(i==0||i==1||i==9||i==10||i==11||i==12)
g[i]=1;
break;
case 3:
G=17;
for(i=0;i<G;i++)
if(i==0||i==1||i==14||i==16)
g[i]=1;
break;
}
m=m+G;
/*for(i=0;i<m;i++)
cout<<crc[i];
cout<<endl;*/
CRCCreate(m,G);
for(i=0;i<m;i++)
source[i]=crc[i]+source[i];
cout<<"CRC编码后发送的信息为:\n";
for(i=0;i<m;i++)
cout<<source[i];
cout<<endl;
for(i=0;i<3000000;i++) //显示格式
if(i%100000==0)
cout<<".";
cout<<"数据传送中";
for(i=0;i<3000000;i++)
if(i%100000==0)
cout<<".";
cout<<endl;
srand(time(NULL));
label=rand()%(m+1);
if(label!=m)
source[label]=(source[label]+1)%2;
cout<<"收到信息为:\n";
CRCCreate(m,G);
for(i=0;i<m;i++)
cout<<source[i];
cout<<endl;
for(i=0;i<m;i++)
if(crc[i])
{
cout<<"传输出错\n";
break;
}
if(i==m)
cout<<"传输正确\n";
}
int main()
{
int i,m,option;
for(i=0;i<N;i++) //初始化
s[i]='*';
cout<<"请输入待发送信息:\n";
gets(s);//从屏幕获取数字序列
for(i=0;i<N&&s[i]!='\0';i++)
source[i]=s[i]-48;
m=i;
cout<<"请选择编码方式,1代表CRC编码,2代表Haiming编码:\n";
cin>>option;
if(option==1)
CRC(m);
else
Haiming(m);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -