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;
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值