1. 程式人生 > >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生成校檢碼檢查,驗證生成式的正確性

(由於水平有限,可能程式仍然存在很多不足,請老師多多指教!如有任何問題或疑問可發郵件至郵箱:與我聯絡,謝謝)