1. 程式人生 > >checksum-8位和16位校驗和程式碼示例

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-816程式碼示例

// 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流816的相互轉換

                //將16位pcm資料轉換成8位有符號的pcm        

android中 IMEIICCID的計算

        我們都知道在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

TCPChecksum)的原理實現

概述   TCP校驗和(Checksum)是一個端到端的校驗和,由傳送端計算,然後由接收端驗證。其目的是為了發現TCP首部和資料在傳送端到接收端之間發生的任何改動。如果接收方檢測到校驗和有差錯,則TCP段會被直接丟棄。   TCP校驗和覆蓋TCP首部和TCP資料,

8微控制器 16 32區別?

指CPU處理的資料的寬度,參與運算的暫存器的資料長度? 如果匯流排寬度與CPU一次處理的資料寬度相同,則這個寬度就是所說的微控制器位數。 如果匯流排寬度與CPU一次處理的資料寬度不同: 1)匯流排寬度小於CPU一次處理的資料寬度,則以CPU的資料寬度定義微控制器的位數,但

32ARM暫存器是如何只傳遞816資料的——由uboot nand 操作想到的

  uboot中可以通過指令對nand操作,以AM3359為例,假設讀取CS0連線的nand,讀取地址0處的資料: 指令暫存器地址 5000007c 地址暫存器地址 50000080 資料暫存器地址 50000084 mw memory write      md  mem

MD5 3216互相進行轉換

MD5 從32位和16位互相進行轉換 程式碼如下: 程式碼塊 程式碼塊語法遵循標準markdown程式碼,例如: // 16進位制字元轉10進位制 inline int hexToDec(char c) { int n; if

關於MD5 3216的區別以及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口。同時,串列埠通訊協

線上生成3216大小寫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