计算检验和

USHORT checksum(USHORT *buffer, int size) // 注意 buffer类型   指向ushort类型(16位)

 { 

unsigned long cksum=0;  //32位


while(size >1) { 
cksum+=*buffer++; 
size -=sizeof(USHORT);    // sizeof(USHORT) = 2


if(size)   //size奇数时

 { 

cksum += *(UCHAR*)buffer; 

//cksum>>16;  //取高16位
//cksum&0xffff;   //取低16位
cksum = (cksum >> 16) + (cksum & 0xffff);   // 高16位+低16位
cksum += (cksum >>16);  //若上一步溢出,即上一步得出的cksum的高16位不位0,则将高16位加到cksum中。
return (USHORT)(~cksum); //各位取反   注意返回值为16位
发布了53 篇原创文章 · 获赞 15 · 访问量 25万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章