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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

checksum 算法

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

說明

  • checksum:總和檢驗碼,校驗和,可以理解為check(校驗),sum(和)。
  • 在數據處理和通信領域,通過一定算法對傳輸的數據進行求和以校驗數據的完整性和準確性。

使用

算法

  • 求和的算法大致是確定的,但是一些細節不是很重要,例如:校驗和使用幾個字節存儲,只要收發兩邊處理規則一樣就行。
  • 網上示例,如下:
USHORT CICMP::CheckSum(USHORT *buff,int Size) {unsigned long cksum = 0;//將數據以字為單位累加到cksum中while (Size > 1){cksum += *buff;Size -= sizeof(USHORT);}//如果為奇數,將最后一個字節擴展到雙字,在累加到cksum中if (Size){cksum += *(UCHAR*)buff;}//將cksum的高16位和低16位相加,取反后得到效驗和cksum = (cksum >> 16) + (cksum & 0xffff);cksum += (cksum >> 16);return (USHORT)(~cksum);//位運算符號:位取反!比如有int a=3;則先把十進制數3,轉化為二進制數,即00000011.那么~a=11111100 }

流程

  • 在數據發送端對數據進行checksum。
  • 將計算出的checksum取反,存放在數據末尾或其它位置發送給接收端。
  • 接收端收到數據后對所有數據進行checksum,如果checksum為0表示數據正確。
  • 原理

    • checksum為0表示數據正確原因:除了數據中的checksum值,其它數據的sum值等于checksum取反,兩值相加值的所有位為1,再取反后即為0,也就是所有數據的checksum為0。
    • 如果所有數據的checksum不為0說明數據發生過變化,因此數據是無效的。

    個人理解

  • checksum算法是不可靠的,只能在要求不是很嚴格的情況下使用,無法用來判斷數據是否一致。
    • checksum算法中每個數據都是位置無關的,因此該算法無法檢測出數據發生交換,測試可知:數據發生交換c不會影響hecksum。
    • checksum能在一些情況下使用,因為數據在發送過程中交換的可能性較小,發生0/1翻轉的數據不抵消就能檢測到,但是應用層一些業務邏輯出現0/1翻轉抵消的情況好像挺常見,因此個人對checksum的可靠性表示懷疑。

    總結

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

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