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生成校檢碼檢查,驗證生成式的正確性
(由於水平有限,可能程式仍然存在很多不足,請老師多多指教!如有任何問題或疑問可發郵件至郵箱:與我聯絡,謝謝)