发送端: 将发送的数据以两字节为单位进行补码相加,checksum处设置为0,得到32字节的数,再将底16位和高16位相加,结果求反,即为较验和。
接收端:和发送端相同的算法,checksum处使用发送端的结果进行补码相加,结果求反为0x0000,表明数据传输正确,否则数据传输不正确,舍弃。
static unsigned short chksum(void *dataptr, unsigned short len)
{
unsigned long acc;
unsigned short src;
unsigned char *octetptr;
acc = 0;
octetptr = (unsigned char*)dataptr;
while (len > 1)
{
src = (*octetptr) << 8; //2个字节结合
octetptr++;
src |= (*octetptr);
octetptr++;
acc += src;
len -= 2;
}
if (len > 0) //最后单个字节,补0,组成2字节
{
src = (*octetptr) << 8;
acc += src;
}
printf("acc=%x\n",acc);
if ((acc & 0xffff0000UL) != 0) //高16位 + 低16位
{
acc = (acc >> 16) + (acc & 0x0000ffffUL);
}
src = (unsigned short)acc;
printf("src=%x\n",src);
return ~src;
}