C 實現校驗和計算(無取反步驟)

2022-02-10 18:26:16 字數 1933 閱讀 3503

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

這道題的校驗和沒有要求最後取反,實際上求和後是要取反的;

原理不難理解,就是資料轉換成十六進製制,然後十六進製制求和。四位十六進製制,所以也要求進製加到結果中;

難點在於字元轉十六進製制,十六進製制有進製相加(我這裡是用string儲存十六進製制數,可能網上還有更直接的十六進製制的儲存方式和計算方式);

先用char型別陣列把資料逐個存進陣列中;

將每兩個char字元轉為四位十六進製制,其中會先將每個char字元先轉為二位十六進製制;

最後進行十六進製制的求和,我沒有選擇將進製留到最後再相加,而是每一次運算都完成進製的相加,因為經過多次運算後,不能確定進製的位數。

//命令列輸入

void waitinput(string command, string &infile)

cout << endl;

}//乙個字元轉二位十六進製制

string ctoh(char charindex)

} if (second >= 10)

} return res;

}//每對字元轉為四位十六進製制

string makepairchar(char firstchar, char secondchar)

//四位十六進製制相加

void sum(string &first, string second)

} //若四位都運算完成後,有第五位的進製,則繼續和進製運算,消除進製

if (carryint)

}int main()

//將檔案所有字元存進陣列

//最後乙個字元為-1,不存進陣列

cout << "檔案資料:" << endl;

vectordataarray;

while (!datafile.eof())

cout << endl << endl;

//用完關閉

datafile.close();

//把每對字元當成16位整數處理

//用string陣列存每對字元的16進製制數

vectorpairchar;

//判斷奇數個字元還是偶數個字元

int remainder = dataarray.size() % 2;

//若是奇數個,迴圈走到倒數第二個

//若是偶數個,迴圈走到倒數第乙個

for (unsigned int i = 0; i < dataarray.size() - remainder; i += 2)

//若資料位元組長度為奇數,則在資料尾部補乙個位元組的0以湊成偶數

//一位元組0也就是空字元,空字元就是\0

if (remainder)

//計算校驗和

string res = pairchar[0];

for (unsigned int i = 1; i < pairchar.size(); i++) sum(res, pairchar[i]);

//列印結果

cout << "校驗和:" << endl;

cout << res << endl;

return 0;

}

c語言實現CRC校驗和

下面我就將今天的demo 簡單的注釋一下 在傳送方的buffer 22 中,前二十個資料為要傳送的資料,而後兩位即buffer 20 和buffer 21 中的資料就是函式int calcrc int crc,const char buf,int len 產生的crc校驗和。如下 intmain i...

C 計算ICMP頭的校驗和例項

複製 如下 ushort checksum ushort buff,int nsize 程式設計客棧 如果為奇數,將最後乙個字擴充套件到雙字,再累加 www.cppcns.comnbsp if nsize nbs 將cksum的高16位與低16位相加,取反後得到校驗和 cksum cksum 16 ...

ip首部校驗和的計算方法(c語言實現)

關聯部落格 關於ip報文校驗和一些思考 把校驗和字段清零。然後對每16位 2位元組 進行二進位制反碼求和,反碼求和的意思是先對每16位求和,再將得到的和轉為反碼。實現如下 short checksum ushort buffer,int size if size cksum cksum 16 cks...