您的位置:首页 > 其它

CRC校验

2015-11-14 10:01 274 查看
1、实验题目:CRC校验

PPP协议受到数据帧后要对数据部分连同FCS字段做CRC校验,结果若不为“0”,则可以肯定数据在传输过程中出错;结果若为“0”,则只能说明很大概率上数据在传输的过程中没有出错,而不是百分之百不出错。这个概率与CRC校验时采用的除数有关,我们把使用某个除数做CRC校验,结果为“0”且数据实际不出错的概率称为该除数的有效性。本次试验要求同学们以实验的方法验证CRC-16的有效性。

2、实验内容:

(1) 随机取1个128位数A。

(2) 将A与CRC-16做除法得余数B,A*216+B保存在C中。

(3) 随机修改C中的1个比特,重新与CRC-16做除法运算,记录余数为0的二进制组合。

(4) 随机修改C中的2个比特,重新与CRC-16做除法运算,记录余数为0的二进制组合。

(5) 随机修改C中的3个比特,重新与CRC-16做除法运算,记录余数为0的二进制组合。

3、实验报告内容:

(1) CRC校验原理。

(2) 实验记录

(3) 随机产生的128位数(以16进制表示)。

(4) 除法运算的算法描述。

(5) 随机修改C中的1个比特,重新与CRC-16做除法运算,余数为0的二进制组合。

(6) 随机修改C中的2个比特,重新与CRC-16做除法运算,余数为0的二进制组合。

(7) 随机修改C中的3个比特,重新与CRC-16做除法运算,余数为0的二进制组合。

4、实验结果分析:

理论上CRC-16的有效性(不一定100%有效)。

#include<iostream>
#include<string>
#include<sstream>
#include <stdlib.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <cmath>
using namespace std;

const int SIZE = 10000; //每组测试10000个数

string fun(string s) //将128位二进制转化为32位十六进制
{
char set[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
if(s.length()==0) return "";
while((s.length() % 4)!=0) s+="0";
string r;
int step=0;
int sum=0;
for(int i=0;i<=s.length();)
{

if(step==4)
{
r+=set[sum];
step=0;
sum=0;
if(i==s.length()) return r;
}
else
{
sum+=(s.at(i)-48)*pow(2,4-step-1);
++step;
++i;
}
}
return "";
}

string GetRandom(int c)
{
string ss="";
for(int i=0;i<c;i++)
{
int r=rand();
stringstream s;
s<<(r%2);
ss+=s.str();
}
return ss;
}
string ChangA(string A,int k)
{
//cout<<"修改A的"<<k<<"个bit"<<endl;
//cout<<"修改前的A:"<<fun(A)<<endl;
for(int i=0;i<k;i++)
{
int p=rand();
p=p%A.length();
string A1=A.substr(0,p);
string A2=A.substr(p+1,A.length()-p-1);
string M=A.substr(p,1);
A="";
A+=A1;
if(M=="0")
{
A+="1";
}
else
{
A+="0";
}
A+=A2;
//cout<<"修改了第"<<p<<"位."<<endl;
}
//cout<<"修改后的A: "<<fun(A)<<endl;
return A;
}
string CRC(string A)
{
string d="11000000000000101";
// string d="1101";
string re="";//商
string ab="";//余数
int length=d.length();
ab=A.substr(0,length);
for(int i=length-1;i<A.length();i++)
{
while(ab.substr(0,1)=="0")
{
ab=ab.substr(1,ab.length()-1);
}
int count=0;
while(ab.length()<d.length())
{
if(i>=A.length())break;
ab+=A.substr(i,1);
if(ab.substr(0,1)=="0")
{
ab=ab.substr(1,ab.length()-1);
}
count++;
i++;
}

while(count>1)
{
re+="0";
count--;
}
if(ab.length()<d.length()){break;}
string aabb=ab;
ab="";
for(int g=0;g<d.length();g++)
{
string x=aabb.substr(g,1);
string y=d.substr(g,1);
if(x==y)ab+="0";
else
ab+="1";
}
re+="1";
}
while(ab.substr(0,1)=="0")
{
ab=ab.substr(1,ab.length()-1);
}
return ab;
}

int main()
{
string A=GetRandom(128);
cout<<"初始A的值为:"<<fun(A)<<endl;
string B=CRC(A);
string C=A.substr(16,A.length()-16)+B;
A=C;
int count=0;
for(int i=0;i<SIZE;i++)
{
string B=A;
B=ChangA(B,1);
if(CRC(B)=="")count++;
}
cout<<"余数为0的几率为:"<<(double)count/SIZE<<endl;
count=0;
for(int i=0;i<10;i++)
{
string B=A;
B=ChangA(B,2);
if(CRC(B)=="")count++;
}
cout<<"余数为0的几率为:"<<(double)count/SIZE<<endl;
count=0;
for(int i=0;i<100;i++)
{
string B=A;
B=ChangA(B,3);
if(CRC(B)=="")count++;
}
/* string A="101001000";
if(CRC(A))
{
cout<<"right"<<endl;
}
else
{
cout<<"wrong"<<endl;
// }*/
cout<<"余数为0的几率为:"<<(double)count/SIZE<<endl;
return 0;
}
Aden:我测试了10000个发现它都是有效的。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: