checksum-8位和16位校驗和程式碼示例
// linux 系統編譯通過 // gcc filename.c -o filename // ./filename #include <stdlib.h> #include <stdio.h> unsigned char ip_hdr_8[] = { 0x45,0x00, 0x00,0x3c, 0x00,0x00, 0x00,0x00, 0x40,0x01, 0x00,0x00, // checksum 0xc0,0xa8, 0x01,0x25, 0xda,0x3c, 0x06,0x82 }; unsigned short ip_hdr_16[] = { 0x4500, 0x003c, 0x0000, 0x0000, 0x4001, 0x0000, // checksum 0xc0a8, 0x0125, 0xda3c, 0x0682 }; unsigned int checksum_8(unsigned int cksum, void *pBuffer, unsigned int size) { char num = 0; unsigned char *p = (unsigned char *)pBuffer; if ((NULL == pBuffer) || (0 == size)) { return cksum; } while (size > 1) { cksum += ((unsigned short)p[num] << 8 & 0xff00) | (unsigned short)p[num + 1] & 0x00FF; size -= 2; num += 2; } if (size > 0) { cksum += ((unsigned short)p[num] << 8) & 0xFFFF; num += 1; } while (cksum >> 16) { cksum = (cksum & 0xFFFF) + (cksum >> 16); } return ~cksum; } unsigned short checksum_16(unsigned short *addr,int len) { unsigned short chksum; unsigned int sum = 0; while(len > 1) { sum += *addr++; len -= 2; } if(len == 1) sum += *(unsigned char*)addr; sum = (sum>>16) + (sum & 0xffff); sum += (sum>>16); chksum = ~sum; return (chksum); } void main() { unsigned short chksum; printf("--------------------------------------------\n"); chksum = checksum_8(0,ip_hdr_8,sizeof(ip_hdr_8)); printf("checksum_8 = 0x%04x \n",chksum); ip_hdr_8[10] = chksum >> 8; ip_hdr_8[11] = chksum & 0xff; chksum = checksum_8(0,ip_hdr_8,20); if(chksum) printf("Checksum_8 is incorrect! \n"); else printf("Checksum_8 is correct! \n"); printf("--------------------------------------------\n"); chksum = checksum_16(ip_hdr_16,sizeof(ip_hdr_16)); printf("checksum_16 = 0x%04x \n",chksum); ip_hdr_16[5] = chksum; chksum = checksum_16(ip_hdr_16,20); if(chksum) printf("Checksum 16 is incorrect! \n"); else printf("Checksum 16 is correct! \n"); printf("--------------------------------------------\n"); }
相關推薦
checksum-8位和16位校驗和程式碼示例
// linux 系統編譯通過 // gcc filename.c -o filename // ./filename #include <stdlib.h> #include <stdio.h> unsigned char ip_hdr_8[]
編寫一個計算機程式用來計算一個檔案的16位校驗和
題目 編寫一個計算機程式用來計算一個檔案的16位校驗和。最快速的方法是用一個32位的整數來存放這個和。記住要處理進位(例如,超過16位的那些位),把它們加到校驗和中。* 原理: 把要傳送的資料看成16位元的二進位制整數序列,並計算他們的和。若資料位元組長度為
android音訊pcm流8位和16位的相互轉換
//將16位pcm資料轉換成8位有符號的pcm
android中 IMEI和ICCID的校驗位計算
我們都知道在android 中有IMEI和ICCID 這兩項資料. 至於這兩項資料的獲取方式以及所表示的意思在此我就不寫了.主要講講這兩項資料最後一位的校驗位如何計算的. IMEI共1
關於校驗和計算方面的C++程式碼,哪位大俠幫忙解讀一下,小弟初學,不太懂!謝謝!
關於校驗和計算方面的C++程式碼,哪位大俠幫忙解讀一下,小弟初學,不太懂!謝謝! 分享| 2010-09-03 16:51 李志鵬6076 | 瀏覽 755 次 #include "
Js實現16/19位銀行卡號前端校驗
//luhn校驗規則:16位銀行卡號(19位通用): // 1.將未帶校驗位的 15(或18)位卡號從右依次編號 1 到 15(18),位於奇數位號上的數字乘以 2。 // 2.將奇位乘積的個十位全部相加,再加上所有偶數位上的數字。
《80X86匯編語言程序設計教程》十一 32位代碼段和16位代碼段切換實例
段描述符 緩沖 row 宏定義 純粹 強行 專用 訪問 錯誤 1、 演示32位代碼段與16位代碼段之間的切換。實現的功能是以十六進制和ASCII碼字符兩種形式顯示從內存地址100000H開始的16個字節的內容。 2、 源代碼如下: 1 ;DosTest
比特幣程式碼分析8 區塊校驗和確認
比特幣節點接收到一個區塊以後,都會進行校驗和確認,如下參考網路圖: 關鍵看看對區塊中的交易進行進一步的校驗程式碼:1.// First transaction must be coinbase, the rest must not be2.if (vtx.empty() || !vtx[0].IsCoinB
TCP校驗和(Checksum)的原理和實現
概述 TCP校驗和(Checksum)是一個端到端的校驗和,由傳送端計算,然後由接收端驗證。其目的是為了發現TCP首部和資料在傳送端到接收端之間發生的任何改動。如果接收方檢測到校驗和有差錯,則TCP段會被直接丟棄。 TCP校驗和覆蓋TCP首部和TCP資料,
8位微控制器 16位 32位區別?
指CPU處理的資料的寬度,參與運算的暫存器的資料長度? 如果匯流排寬度與CPU一次處理的資料寬度相同,則這個寬度就是所說的微控制器位數。 如果匯流排寬度與CPU一次處理的資料寬度不同: 1)匯流排寬度小於CPU一次處理的資料寬度,則以CPU的資料寬度定義微控制器的位數,但
32位ARM暫存器是如何只傳遞8位、16位資料的——由uboot nand 操作想到的
uboot中可以通過指令對nand操作,以AM3359為例,假設讀取CS0連線的nand,讀取地址0處的資料: 指令暫存器地址 5000007c 地址暫存器地址 50000080 資料暫存器地址 50000084 mw memory write md mem
MD5 32位和16位互相進行轉換
MD5 從32位和16位互相進行轉換 程式碼如下: 程式碼塊 程式碼塊語法遵循標準markdown程式碼,例如: // 16進位制字元轉10進位制 inline int hexToDec(char c) { int n; if
關於MD5 32位和16位的區別以及linux /etc/shadow 檔案詳解
有人說md5,128位,32位,16位,到底md5多長? md5的長度,預設為128bit,也就是128個0和1的二進位制串。 這樣表達是很不友好的。 所以將二進位制轉成了16進位制,每4個bit表示一個16進位制, 所以128/4 = 32 換成16進製表示後
Spring--實體類Date欄位多種格式的校驗
情景說明: 採用mybatis-gen生成的bean類,資料庫中的Datetime欄位對映為Date欄位 頁面上傳來的內容是 yyyy-MM-dd 日期格式,用@Past註解日期,如下 @Past(
串列埠引數詳解:波特率,資料位,停止位,奇偶校驗位
簡介 串列埠是一種非常通用的裝置通訊的協議(不要與通用序列匯流排Universal Serial Bus(USB)混淆)。大多數計算機包含兩個基於RS232的串列埠。串列埠同時也是儀器儀表裝置通用的通訊協議;很多GPIB相容的裝置也帶有RS-232口。同時,串列埠通訊協
線上生成32位和16位大小寫MD5密文
MD5是一種不可逆的加密演算法,全稱是Message-Digest Algorithm 5(資訊-摘要演算法)。是當前計算機領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一。 MD5的典型應用是對一段資訊(Message)產生資訊摘要(Me
C語言16位拆成高低八位,和高低八位合成16位資料(1)
#include <stdio.h> #include <stdlib.h> char right,left,temp;//right表示第八位,left表示高八位 int si
Wireshark抓包時顯示TCP校驗和錯誤(checksum incorrect)
在抓包的過程發現很多從本地主機(客戶機)發出的 TCP 包有很多都是報 IP checksum error ,但應用正常,從 server 返回的包也一切正常,很是奇怪。 如圖,很多黑色的條目,黑色一般就是有問題的包: 網上有一篇帖子,說明了這個情況產生的原因: h
C語言位操作--奇偶校驗演算法
資訊是以位元流的方式傳輸的,類似01000001。在傳輸過程中,有可能會發生錯誤,比如,我們儲存了01000001,但是取出來卻是01000000,即低位由0變成了1。為了檢測到這種錯誤,我們可以通過“奇偶校驗”來實現。假如,我們儲存的資料是一個位元組,8個位元
ruby中布林型別欄位的非空校驗
無法用validate_presence_of來對boolean型別欄位進行非空校驗 migration程式碼 class CreateCorporateFinancials < ActiveRecord::Migration def self