网际校验和(Internet Checksum)算法实现

网际校验和算法实现  佟强 2008.10.20

原理请参考:

   网际校验和算法: http://blog.csdn.net/microtong/archive/2008/10/20/3112139.aspx

   网际校验和算法的特征:http://blog.csdn.net/microtong/archive/2008/10/20/3112157.aspx

  1. /*
  2.    pBuffer是要校验的数据报开始地址
  3.    nSize指定校验内容长度,单位是字节
  4. */
  5. unsigned short checksum_calculating(unsigned short *pBuffer, int nSize)
  6. {
  7.      unsigned long dwCksum = 0;   // 32位累加和
  8.      unsigned char* p=(unsigned char*)&dwCksum;
  9.     // 以两字节为单位反复累加
  10.     while(nSize > 1)
  11.    {
  12.         dwCksum += *pBuffer++;
  13.          printf("/t/t%.2x %.2x %.2x %.2x/n",*p,*(p+1),*(p+2),*(p+3));
  14.          nSize -= sizeof(unsigned short);
  15.     }
  16.     printf("/t/t%.2x %.2x %.2x %.2x/n",*p,*(p+1),*(p+2),*(p+3));
  17.     // 如果总字节数为奇数则加上最后一个字节
  18.     if (nSize)
  19.    {
  20.         dwCksum += *(unsigned char*) pBuffer;
  21.         printf("/t/t%.2x %.2x %.2x %.2x/n",*p,*(p+1),*(p+2),*(p+3));
  22.    }
  23.     //把32位整数高位中的进位累加到低16位
  24.     while(dwCksum>>16){
  25.            dwCksum = (dwCksum&0xffff) + (dwCksum>>16);
  26.            printf("/t/t%.2x %.2x %.2x %.2x/n",*p,*(p+1),*(p+2),*(p+3));
  27.      }
  28.      //取反得到校验和
  29.     dwCksum = ~dwCksum;
  30.      printf("/t/t%.2x %.2x %.2x %.2x/n",*p,*(p+1),*(p+2),*(p+3));
  31.     // 返回16位校验和
  32.     return (unsigned short) (dwCksum);
  33. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值