65,187
社区成员




USHORT CICMP::CheckSum(USHORT *buff,int Size)
{
unsigned long cksum = 0;
//将数据以字为单位累加到cksum中
while (Size > 1)
{
cksum += *buff;
Size -= sizeof(USHORT);
}
//如果为奇数,将最后一个字节扩展到双字,在累加到cksum中
if (Size)
{
cksum += *(UCHAR*)buff;
}
//将cksum的高16位和低16位相加,取反后得到效验和
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >> 16);
return (USHORT)(~cksum);//位运算符号:位取反!比如有int a=3;则先把十进制数3,转化为二进制数,即00000011.那么~a=11111100
}