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与我联系,谢谢)
- CRC校验实现-实验报告(附主要实现代码)
- C# 实现CRC校验代码
- CRC代码算法实现-CRC-16 MODBUS代码实验
- 汇编语言实现CRC校验
- CRC校验的实现
- CRC校验C实现
- Python实现CRC校验
- CRC校验实现
- 循环冗余校验(CRC校验)的实现代码
- CRC原理详解(附crc16校验代码)
- CRC校验C语言实现
- VB CRC校验算法实现
- CRC校验C语言实现
- C#实现CRC校验算法
- crc校验的实现(移位寄存器)
- java来实现CRC校验
- [转帖]计算法简单实现crc校验
- [转帖]计算法简单实现crc校验
- test
- 决定成败的49个细节
- 什么是 AJax?
- 使用Eclipse+CDT+MinGW32进行C++开发
- 用设计模式固化C#程序
- CRC校验实现-实验报告(附主要实现代码)
- php远程文件包含漏洞
- 关于php包含Apache日志的随想
- 1-02 C++起步: 用结构组织数据 —— 数据封装初步
- 蓝牙的问题
- 怎样配置vc的环境来编译驱动
- ASP汉字转拼音函数
- 如何在Oracle中使用Sequence
- EditPlus 2.12 使用技巧集萃