zoukankan      html  css  js  c++  java
  • 网际校验和(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. }
  • 相关阅读:
    【lc-database】595. 大的国家
    Visual Studio 2010软件安装教程
    Win10系统下安装VC6.0教程
    HTTP协议
    正则表达式
    类装饰器
    装饰器工厂函数
    装饰器函数
    闭包
    web服务器
  • 原文地址:https://www.cnblogs.com/zhangyunlin/p/6168134.html
Copyright © 2011-2022 走看看