編寫乙個電腦程式用來計算乙個檔案的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位址,如果租用到則可以了解它分配到的是什麼位址...