日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

checksum校验

發布時間:2024/3/24 编程问答 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 checksum校验 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原理

??????? P/ICMP/IGMP/TCP/UDP等協議的校驗和算法都是相同的,采用的都是將數據流視為16位整數流進行重復疊加計算。為了計算檢驗和,首先把檢驗和字段置為0。然后,對有效數據范圍內中每個16位進行二進制反碼求和,結果存在檢驗和字段中,如果數據長度為奇數則補一字節0。當收到數據后,同樣對有效數據范圍中每個16位數進行二進制反碼的求和。由于接收方在計算過程中包含了發送方存在首部中的檢驗和,因此,如果首部在傳輸過程中沒有發生任何差錯,那么接收方計算的結果應該為全0或全1(具體看實現了,本質一樣; 校驗時可能返回~checksum) 。如果結果不是全0或全1,那么表示數據錯誤。

例子:

[cpp]?view plaincopy
  • #include?<stdio.h>??
  • ??
  • unsigned?short?checksum(unsigned?short?*pdate,?int?size)??
  • {??
  • ????unsigned?int?sum=0;??
  • ????while?(size>1)??
  • ????{?????
  • ????????sum?+=?*pdate;??
  • ????????pdate++;??
  • ????????size?-=?sizeof(short);??
  • ????}?????
  • ??????
  • ????if?(size)??
  • ????????sum?+=?*(unsigned?char*)pdate;??
  • ??????
  • ????while(sum>>16)??
  • ????{?????
  • ????????sum?=?(sum?&?0xffff)?+?(sum>>16);??
  • ????}?????
  • ??
  • ????return?~sum;??
  • }??
  • ??
  • int?main(void)??
  • {??
  • ????unsigned?short?checksum_code=0;??
  • ????unsigned?short?date[]?=?{0,0x4500,?0x0029,?0x44f1,0x4000,?0x8006,?0xc0a8,?0x01ae,?0x4a7d,?0x477d};//date[0]存放校驗碼??
  • ????unsigned?short?check_res=0;??
  • ??
  • ????checksum_code?=?checksum((unsigned?short*)date,?sizeof(date));//產生校驗碼??
  • ????date[0]?=?checksum_code;??
  • ????printf("generate:%x\n",?checksum_code);??
  • ??
  • ????check_res=?checksum((unsigned?short*)date,?sizeof(date));//校驗結果??
  • ????printf("check?result:%x\n",?check_res);??
  • ????return?0;??
  • }??
  • 編譯運行:

    總結

    以上是生活随笔為你收集整理的checksum校验的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。