計算機網路模擬實驗 C 模擬計算效驗和

2021-10-07 04:46:20 字數 1644 閱讀 8800

編寫乙個電腦程式用來計算乙個檔案的16位效驗和。最快速的方法是用乙個32位的整數來存放這個和。記住要處理進製(例如,超過16位的那些位),把它們加到效驗和中。

原理:把要傳送的資料看成16位元的二進位制整數序列,並計算他們的和。若資料位元組長度為奇數,則在資料尾部補乙個位元組的0以湊成偶數。

例子:16位效驗和計算,下圖表明乙個小的字串的16位效驗和的計算。

為了計算效驗和,傳送計算機把每對字元當成16位整數處理並計算效驗和。如果效驗和大於16位,那麼把進製一起加到最後的效驗和中。

本人**思路:計算檔案的校驗和首先要讀取檔案中的內容,我使用c++提供的ifstream類來讀取檔案內容,以文字方式讀取。因為是計算檔案的16位校驗和,因此每兩個字元組成乙個數值,然後將所有的數值進行相加,我的做法是把讀取到的字元以每兩個字元劃分為乙個組,要是字元個數為奇數,要做補乙個位元組的0,然後將每乙個小組的第乙個字元的ascii值乘以256加上第二個字元的ascii值組成乙個數值。再把所有的數值相加得到總和,將總和除以65536,得到進製數;將總和取模65536,得到保留數。最後將進製數和保留數相加得到校驗和的十進位制數,再將該十進位制數轉化為十六進製制數就行了。

**缺陷:

1.不能計算過大的檔案

2.不能計算含中文的檔案

#include

#include

#include

using

namespace std;

intmain()

string temp_text;

//用於儲存從檔案中讀取出來的一行資料

while

(getline

(in, temp_text)

) text ="";

}else

text = text[len-1]

;//因為字串的個數為奇數,所以還存在乙個字元未進行處理}}

in.close()

;if(text !="")

else

cout <<

"資料位元組總長度為偶數,不需要進行補位元組"

<< endl;

int carry = sum /

256/

256;

//記錄進製數

cout <<

"進製數為"

<

if(carry >0)

//如果存在進製,就把進製一起加到最後的效驗和

sum = sum %

65536

+ carry;

char sum_str[15]

; cout <<

"校驗和的十進位制為:"

<< sum<< endl;

_itoa_s

(sum, sum_str,10,

16);//將sum轉化為十六進製制的字串,並儲存在sum_str中

cout <<

"校驗和的十六進製制為:"

<< sum_str << endl;

}

測試內容和測試結果:

計算機網路實驗

1 實驗題目 幀的封裝 幀的封裝時任何資料鏈路層協議必須實現的功能,對幀的封裝建立在詳細了解該協議 pdu格式的基礎之上。本次試驗要求同學們自己動手實現 ppp協議和 mac協議的 pdu封裝程式。2 實驗內容 1 隨機生成 64位元組的資料 a,作為網際層 ip協議的 pdu。2 將a 封裝成字元...

計算機網路 期末實驗

1 什麼是arp?答 arp協議 位址解析協議 是 address resolutionprotocol 的縮寫。所謂 位址解析 就是主機在傳送幀前將目的邏輯位址轉換成目的實體地址的過程。在使用tcp ip協議的乙太網中,arp協議完成將ip位址對映到mac位址的過程。2 給出練習3實驗步驟和實驗結...

計算機網路 ipconfig實驗

no.2 總結ipconfig可用於顯示當前的tcp ip配置的設定值這些資訊一般用來檢驗人工配置的tcp ip設定是否正確。但是,如果計算機和所在區域網使用來動態主機配置協議 dhcp協議 ipconfig可以讓你了解年的計算機是否成功的租用到乙個ip位址,如果租用到則可以了解它分配到的是什麼位址...