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...