计算检验和

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位

你可能感兴趣的:(计算检验和)