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位
}