Internet校验和(checksum)算法

发送端: 将发送的数据以两字节为单位进行补码相加,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;
}

你可能感兴趣的:(算法)