網際校正和(Internet Checksum)演算法實現

來源:互聯網
上載者:User

網際校正和演算法實現  佟強 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. }
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.