计算机网络
实验报告
班级:03计算机B班
实验名称:CRC校验实现
姓名:kikikind
学号:086
指导老师:何怀文
日期:2006-4-22
1.学习CRC循环冗余检验原理
2.掌握实现方法
WindowXp+sp2 , VC++ 6.0/MFC
三.实验任务
1.通过学习CRC原理,验证,检错,掌握其工作原理;
2.编写CRC编码程序;
3.总结实验过程,编写提交实验报告:方案、编程、调试、结果、分析、结论。
四.CRC编程实现
1.程序设计
1.以图型界面方式显示,可选择编码方式
i.CRC16
ii.CRCCCIT
iii.CRC32
iv.自定义多项式
2.MFC实现
3.自定义编码数据(十进制方式)
4.显示生成编码与余数
5.检验正确性
2.十进制转二进制(以下是具体函数)
具体算法:
//1.找不出大于转换数的最大2^n
//2.转换数减去2^n,再找不大于新的当前数
//3.当前数大于2^n时置1,小于时置0,同时2^n/2
void CCRC::DecToBinary( CString & ChangeString )
{
if ( ChangeString.IsEmpty())
return;
unsigned long num = atol(ChangeString.GetBuffer(ChangeString.GetLength()));
unsigned long temp = 1;
int k = 0;
//求出最大不超过当前数的2次幂,设置字符串长度
while ( temp < num )
{k++; temp*=2; }
//设置字符串长度
ChangeString.GetBufferSetLength(k);
ChangeString.SetAt(0,'1');
temp /= 2;
num -= temp;
//num为当前数, temp保存不大于num的最大2^n数,
k = 1;
while( num >= 0 && temp != 0)
{
//这句很重要,每设一位0 or 1 temp都要/2
temp /= 2;
//当前数比2^n少时,就置0
while( num < temp )
{
ChangeString.SetAt(k++,'0');
temp /= 2;
}
//如果减尽,即当前数num=0的话,最后一位置0,其它情况时是num > temp所以置一
if ( num != 0)
ChangeString.SetAt(k++,'1');
num -= temp;
}
}
3.转换编码(以下是具体函数)
//编码
//strChange编码的字符串strPoly生成多项式SaveRadius保存余数字符串
bool CCRC::CRC_Code(CString strChange, CString strPoly, CString & SaveRadius, bool isTest )
{//除数,每次运算的模2数,余数
char * Buf;
int ChangeLen,PolyLen;
int StrPos, Pos, BufPos;
bool isLast = false;
ChangeLen = strChange.GetLength();
PolyLen = strPoly.GetLength();
//初始化各数组长度(保存多项式的二进制字符串长度即为最高次数,+1位是用来保存结束符)
Buf = new char[PolyLen+1];
//如果不是用于测试,是在多项式后尾添0
if ( !isTest )
{
strChange.GetBufferSetLength( ChangeLen + PolyLen);
StrPos= ChangeLen;
ChangeLen = ChangeLen + PolyLen - 1;
while ( StrPos < ChangeLen )
strChange.SetAt(StrPos++,'0');
strChange.SetAt(StrPos,'/0');
}
//进行模2除
StrPos = PolyLen;
Pos = 0;
while( Pos < PolyLen )
{
Buf[Pos] = strChange.GetAt(Pos);
Pos++;
}
//从多项式长开始向右扫
while( StrPos <= ChangeLen )
{
Pos = 0;
isLast = false;
//单次多项式除
while ( Pos < PolyLen)
{
if ( Buf[Pos] == strPoly.GetAt(Pos) )
Buf[Pos++] = '0';
else
Buf[Pos++] = '1';
}
//调整buf,如不是最后一次,则将buf中从第一个不为0的数开始将数向前移
BufPos = 0;
Pos = 0;
//找出第一个不为1的字符,如果全为0,表示已除完
while ( Buf[BufPos++] != '1' && BufPos< PolyLen);BufPos--;
if ( StrPos == ChangeLen -1 && BufPos > 1)
{
BufPos = 2;
isLast = true;
}
//本身转移
if ( BufPos > ( ChangeLen - StrPos ))
{
BufPos = ChangeLen - StrPos + 1;
isLast = true;
}
while( BufPos < PolyLen )
Buf[Pos++] = Buf[BufPos++];
//如果是最后一次就跳出去
if ( StrPos == ChangeLen )
break;
//填充从转换串的新字符
while( Pos < PolyLen && StrPos < ChangeLen )
Buf[Pos++] = strChange.GetAt(StrPos++);
//控制最后一轮
if ( isLast )
break;
}
Buf[PolyLen-1] = '/0';
SaveRadius = CString(Buf);
delete [] Buf;
return ( atol(SaveRadius.GetBuffer(SaveRadius.GetLength())) == 0 );
}
4.检查正确性
设置编码函数最后一个参数isTest为TURE,则不会在转换串后添0,重新计算一次,保存返回值,如果为0,则表示编码成功!
五.附件
l附件有实现程序,可直接运行
l可能存有不足,测试基本正常
l完整源程序
六.程序介绍
l采用计算法,以数组方式存放二进制字符串模拟手工计算
l可自定义校检多项式
l生成校检码检查,验证生成式的正确性
(由于水平有限,可能程序仍然存在很多不足,请老师多多指教!如有任何问题或疑问可发邮件至邮箱:与我联系,谢谢)