CRC校验实现-实验报告(附主要实现代码)

来源:互联网 发布:天文望远镜推荐 知乎 编辑:程序博客网 时间:2024/05/16 08:23

计算机网络

 

实验报告

 

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

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