计算机网络crc校验实验报告,CRC校验实现-实验报告(附主要实现代码)
計(jì)算機(jī)網(wǎng)絡(luò)
實(shí)驗(yàn)報(bào)告
班級:03計(jì)算機(jī)B班
實(shí)驗(yàn)名稱:CRC校驗(yàn)實(shí)現(xiàn)
姓名:kikikind
學(xué)號:086
指導(dǎo)老師:何懷文
日期:2006-4-22
1.學(xué)習(xí)CRC循環(huán)冗余檢驗(yàn)原理
2.掌握實(shí)現(xiàn)方法
WindowXp+sp2 , VC++ 6.0/MFC
三.實(shí)驗(yàn)任務(wù)
1.通過學(xué)習(xí)CRC原理,驗(yàn)證,檢錯(cuò),掌握其工作原理;
2.編寫CRC編碼程序;
3.總結(jié)實(shí)驗(yàn)過程,編寫提交實(shí)驗(yàn)報(bào)告:方案、編程、調(diào)試、結(jié)果、分析、結(jié)論。
四.CRC編程實(shí)現(xiàn)
1.程序設(shè)計(jì)
1.以圖型界面方式顯示,可選擇編碼方式
i.CRC16
ii.CRCCCIT
iii.CRC32
iv.自定義多項(xiàng)式
2.MFC實(shí)現(xiàn)
3.自定義編碼數(shù)據(jù)(十進(jìn)制方式)
4.顯示生成編碼與余數(shù)
5.檢驗(yàn)正確性
2.十進(jìn)制轉(zhuǎn)二進(jìn)制(以下是具體函數(shù))
具體算法:
//1.找不出大于轉(zhuǎn)換數(shù)的最大2^n
//2.轉(zhuǎn)換數(shù)減去2^n,再找不大于新的當(dāng)前數(shù)
//3.當(dāng)前數(shù)大于2^n時(shí)置1,小于時(shí)置0,同時(shí)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;
//求出最大不超過當(dāng)前數(shù)的2次冪,設(shè)置字符串長度
while ( temp < num )
{k++; temp*=2; }
//設(shè)置字符串長度
ChangeString.GetBufferSetLength(k);
ChangeString.SetAt(0,'1');
temp /= 2;
num -= temp;
//num為當(dāng)前數(shù), temp保存不大于num的最大2^n數(shù),
k = 1;
while( num >= 0 && temp != 0)
{
//這句很重要,每設(shè)一位0 or 1 temp都要/2
temp /= 2;
//當(dāng)前數(shù)比2^n少時(shí),就置0
while( num < temp )
{
ChangeString.SetAt(k++,'0');
temp /= 2;
}
//如果減盡,即當(dāng)前數(shù)num=0的話,最后一位置0,其它情況時(shí)是num > temp所以置一
if ( num != 0)
ChangeString.SetAt(k++,'1');
num -= temp;
}
}
3.轉(zhuǎn)換編碼(以下是具體函數(shù))
//編碼
//strChange編碼的字符串strPoly生成多項(xiàng)式SaveRadius保存余數(shù)字符串
bool CCRC::CRC_Code(CString strChange, CString strPoly, CString & SaveRadius, bool isTest )
{//除數(shù),每次運(yùn)算的模2數(shù),余數(shù)
char * Buf;
int ChangeLen,PolyLen;
int StrPos, Pos, BufPos;
bool isLast = false;
ChangeLen = strChange.GetLength();
PolyLen = strPoly.GetLength();
//初始化各數(shù)組長度(保存多項(xiàng)式的二進(jìn)制字符串長度即為最高次數(shù),+1位是用來保存結(jié)束符)
Buf = new char[PolyLen+1];
//如果不是用于測試,是在多項(xiàng)式后尾添0
if ( !isTest )
{
strChange.GetBufferSetLength( ChangeLen + PolyLen);
StrPos= ChangeLen;
ChangeLen = ChangeLen + PolyLen - 1;
while ( StrPos < ChangeLen )
strChange.SetAt(StrPos++,'0');
strChange.SetAt(StrPos,'/0');
}
//進(jìn)行模2除
StrPos = PolyLen;
Pos = 0;
while( Pos < PolyLen )
{
Buf[Pos] = strChange.GetAt(Pos);
Pos++;
}
//從多項(xiàng)式長開始向右掃
while( StrPos <= ChangeLen )
{
Pos = 0;
isLast = false;
//單次多項(xiàng)式除
while ( Pos < PolyLen)
{
if ( Buf[Pos] == strPoly.GetAt(Pos) )
Buf[Pos++] = '0';
else
Buf[Pos++] = '1';
}
//調(diào)整buf,如不是最后一次,則將buf中從第一個(gè)不為0的數(shù)開始將數(shù)向前移
BufPos = 0;
Pos = 0;
//找出第一個(gè)不為1的字符,如果全為0,表示已除完
while ( Buf[BufPos++] != '1' && BufPos< PolyLen);BufPos--;
if ( StrPos == ChangeLen -1 && BufPos > 1)
{
BufPos = 2;
isLast = true;
}
//本身轉(zhuǎn)移
if ( BufPos > ( ChangeLen - StrPos ))
{
BufPos = ChangeLen - StrPos + 1;
isLast = true;
}
while( BufPos < PolyLen )
Buf[Pos++] = Buf[BufPos++];
//如果是最后一次就跳出去
if ( StrPos == ChangeLen )
break;
//填充從轉(zhuǎn)換串的新字符
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.檢查正確性
設(shè)置編碼函數(shù)最后一個(gè)參數(shù)isTest為TURE,則不會在轉(zhuǎn)換串后添0,重新計(jì)算一次,保存返回值,如果為0,則表示編碼成功!
五.附件
l附件有實(shí)現(xiàn)程序,可直接運(yùn)行
l可能存有不足,測試基本正常
l完整源程序
六.程序介紹
l采用計(jì)算法,以數(shù)組方式存放二進(jìn)制字符串模擬手工計(jì)算
l可自定義校檢多項(xiàng)式
l生成校檢碼檢查,驗(yàn)證生成式的正確性
(由于水平有限,可能程序仍然存在很多不足,請老師多多指教!如有任何問題或疑問可發(fā)郵件至郵箱:與我聯(lián)系,謝謝)
總結(jié)
以上是生活随笔為你收集整理的计算机网络crc校验实验报告,CRC校验实现-实验报告(附主要实现代码)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 股票投资应该注意的问题 这几点千万不能
- 下一篇: html5应用测试方法,详解html5的