计算机网络crc校验实验报告,CRC校验实现-实验报告(附主要实现代码)

计算机网络

实验报告

班级: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生成校检码检查,验证生成式的正确性

(由于水平有限,可能程序仍然存在很多不足,请老师多多指教!如有任何问题或疑问可发邮件至邮箱:与我联系,谢谢)

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值