unsigned short checksum(char *addr, int count)
if( count > 0 )//=1,說明count為奇數
sum += *addr;
while (sum>>16)//當和的高16位不為0,把高16位作為校驗和的一部分求和,
sum = (sum & 0xffff) + (sum >> 16);
return (short)~sum;
}/*****************************八位checksum*********************************/
char checksum(char *addr, int count)
while (sum>>8)
sum = (sum & 0xff) + (sum >> 8);
return (char)~sum;
}原理:
1、校驗和的計算:將緩衝區的資料中挨個數累加(x),然後取反輸出(~x)。
2、校驗:將緩衝區的資料和校驗和(~x)一起求校驗和,累加和(y(及取反輸出(~y)。y =緩衝區的資料累加(x(+校驗和(~x)=0xffff。~y=0。所以當結果為0,說明資料傳輸沒問題。
如果校驗和計算時高16位(xh)不等於零,(xh)+(xl)= z,新校驗和為~z。 校驗時,再次求校驗和 :先求和(xh)*2^16 +(xl)+ ~z= (xh)*2^16 +(xl)+ 0xffff - z =(xh)*2^16+(0xffff -(xh))=y.yh=xh,yl=(0xffff -(xh),yh+yl=0xffff.
檔案校驗和(checksum或Hash)計算工具
windows作業系統 1 certutil windows自帶的certutil工具 用法 certutil hashfile pathtofiletocheck hashalgorithm 引數 pathtofiletocheck 待計算校驗和的檔案 hashalgorithm hash演算法,...
網路資料報效驗和(checksum)的計算
在網路傳送的資料報為了保證傳送正確都含有效驗字段,ip arp tcp等每 個資料段都有自己的效驗和。效驗的計算並不複雜。把相應資料報段的所有資料看成乙個位元組陣列 把他們分成16bit一組 計算其和 ab cd e0 xy 計算採用迴圈進製,最高位的進製加到最低位,如果計算出的 xy 所有位都為1...
詳解IP首部效檢和 checksum
最近一段時間,對網路又開始追根溯源,最好的辦法就是開啟開源協議棧看乙個究竟,不求寫乙個完整的ip協議棧,但求通達解惑!眾所周知,ip頭定義如下 struct ipheader unsigned char ver hlen unsigned char tos unsigned short len un...