计算机网络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生成校檢碼檢查,驗證生成式的正確性
(由于水平有限,可能程序仍然存在很多不足,請老師多多指教!如有任何問題或疑問可發郵件至郵箱:與我聯系,謝謝)
總結
以上是生活随笔為你收集整理的计算机网络crc校验实验报告,CRC校验实现-实验报告(附主要实现代码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 股票投资应该注意的问题 这几点千万不能
- 下一篇: html5应用测试方法,详解html5的