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

来源:互联网 发布:局部优化算法 编辑:程序博客网 时间:2024/05/18 02:55

网际校验和算法实现  佟强 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. }
原创粉丝点击