C 實現計算乙個檔案的16位校驗和

2021-10-06 09:40:28 字數 1656 閱讀 8407

1、問題敘述:

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

要求:

1)以命令列形式執行:check_sum infile

其中 check_sum 為程式名,infile 為輸入資料檔名。

2)輸出:資料檔案的校驗和

原理:

把要傳送的資料看成 16 位元的二進位制整數序列,並計算他們的和。若資料字

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

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

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

2、**實現

#define _crt_secure_no_warnings

#include

#include

#include

using

namespace std;

vector<

int>group;

//記錄每對字元的校驗和

char buf[2]

;//儲存每次讀到的字元

/*計算校驗和*/

intcheck_sum()

intmain()

if(num ==1)

//如果資料位元組長度為奇數,則在資料尾部補乙個位元組的0

/*輸出校驗和*/

cout <<

"校驗和為:"

<< hex <<

check_sum()

<< endl;

/*輸出校驗序列*/

int length = group.

size()

; cout <<

"校驗序列為:"

;for

(int i =

0; i < length; i++

) cout << group[i]

<<

'\t'

; cout << endl;

fclose

(file)

;return0;}}}

執行結果:

注意:

其實真正的校驗和最終是要取反的,即~71fc=8e03。

**實現:~(check_sum() | 0xffff0000)

原因:

int是4個位元組32位,所以高16位應該忽略,對低16位取反。採取先讓高16位為1,即check_sum()與0xffff0000相或,然後,取反為0的措施。

Nodejs 實現乙個CRC16校驗

近日在開發乙個資料平台,據說nodejs比較適合dirt型別的程式,所以也搞了一把,雖然接收 及其報文解析等功能順利的實現了,但是由於某些報文涉及到應答,故而需要crc校驗,也算是乙個小坑吧,故而記錄一下。完整報文 0101qn 20160801085857223 st 32 cn 1062 pw ...

計算機網路中,16位校驗和的實現

include include include include include using namespace std struct m struct mm mm add mm g1,mm g2 int ff 4 int c1,c2,c3,c4 c1 g1.m2.low g2.m2.low if c...

C 上傳檔案的乙個實現

c 上傳檔案的乙個實現 using system using system.data using system.data.sqlclient using ca.components 全部在元件命名空間下 namespace ca.components catch exception exec dou...