#include <windows.h>
//计算校验和
unsigned short checksum(unsigned short *buffer,int size)//size为报文大小,以字节为单位;buffer为16位,但是几个buffer相加后就
//可能超过16位,故checksum是unsigned long 即32位。
{
unsigned long cksum=0;
while(size>1)//逐个字节进行计算,进行一次累加和
{
cksum+=*buffer++;
size-=sizeof(USHORT);
}
if(size)//有可能最后剩下几位不足以组成一个字节(16位)
{
cksum+=*(UCHAR *)buffer;//将剩下的高位补0后当成一个字节进行计算
}
//将32位数的cksum转换成16位
while (cksum>>16)
cksum=(cksum>>16)+(cksum & 0xffff);//将高位16bit移到低位与低位16bit相加;
//如上面的相加产生了进位,则cksum>>16不为0,故while(cksum>>16)语句已考虑了进位
return (USHORT) (~cksum);//将校验和变反!
}