累加和校驗演算法
『壹』 疊加原理的驗證 計算值怎麼算
從此的的兩茫茫,
心靈在眩暈,
這樣想,也就使我
因為你不過是許多事物之一。
我是敏捷奮飛的靜鳥
了的么往如邁步於是。
『貳』 如何校驗和是通過一定的演算法掃描一個數據計算出的一個數值。用c語言
#include<stdio.h>
intQuicksum(char*str)//用指針做校驗函數的參數,來接收被校驗的字元串A;
{
intsum=0,loc=1,i,n;//sum代表校驗和,loc代表每個字元在字元串A里的位置;
char*p;
p=str;//將被校驗字元串A的地址賦值給字元指針p,用p表示位置;
n=strlen(p);//用strlen函數求出A的有效長度;
for(i=0;i<n;i++)//注意循環的次數。體會i<n的意思,保證能計算到每個字元
{
if((*p)==''){p++;loc++;continue;}//如果遇到空格,就將位置指針向後移動一個,跳過空格
//注意loc也要增加一,為了正確記錄每個字元的位置
sum+=((*p-'A')+1)*loc;//如果此處不是空格,就根據校驗計算該位置所代表的和,進行累加
loc++;//將位置指針移動到下一個字元,同時loc也跟著變化
p++;
}
returnsum;//返回校驗和
}
voidmain()
{
intjiaoyanhe;
char*string;
printf("Pleaseinput(A-Z):");
gets(string);//使用gets函數輸入字元串;
jiaoyanhe=Quicksum(string);//調用Quicksum函數進行校驗和的計算。
printf("jiaoyanhe:");
printf("%d ",jiaoyanhe);
}
上機運行的時候,把注釋全刪了吧,要不然可能運行出錯,多體會一下吧,這只是其中的一種方法而已,多上機運行代碼,理解下裡面的邏輯,好運。
『叄』 什麼是校驗和
其實這是一種加密技術用於對文件內容進行審計的方法,使用 精通讀文件把文件讀到內存中,再對文件內容作一個 MD5 校驗得到一串密碼,就是校驗和。
補充:
1、IP首部校驗和欄位是根據IP首部計算的校驗和碼,它不對首部後面的數據進行計算。ICMP、IGMP、UDP和TCP在它們各自的首部中均含有同時覆蓋首部和數據校驗和碼。
2、IP首部校驗和計算:
為了計算一份數據報的IP檢驗和,首先把檢驗和欄位置為0。然後,對首部中每個16bit進行二進制反碼求和(整個首部看成是由一串16bit的字組成),結果存在檢驗和欄位中。當收到一份IP數據報後,同樣對首部中每個16bit進行二進制反碼的求和。由於接收方在計算過程中包含了發送方存在首部中的檢驗和,因此,如果首部在傳輸過程中沒有發生任何差錯,那麼接收方計算的結果應該為全1。如果結果不是全1(即檢驗和錯誤),那麼IP就丟棄收到的數據報。但是不生成差錯報文,由上層去發現丟失的數據報並進行重傳。
3、TCP和UDP校驗和計算(兩者相同)
校驗和還包含—個96位的偽首標,理論上它位於TCP首標的前面。這個偽首標包含了源地址、目的地址、協議和TCP長度等欄位,這使得TCP能夠防止出現路由選擇錯誤的數據段。這些信息由網際協議(IP)承載,通過TCP/網路介面,在IP上運行的TCP調用參數或者結果中傳遞。
偽首部並非UDP數據報中實際的有效成分。偽首部是一個虛擬的數據結構,其中的信息是從數據報所在IP分組頭的分組頭中提取的,既不向下傳送也不向上遞交,而僅僅是為計算校驗和。
這樣的校驗和,既校驗了UDP用戶數據的源埠號和目的埠號以及UDP用戶數據報的數據部分,又檢驗了IP數據報的源IP地址和目的地址。(偽報頭保證UDP和TCP數據單元到達正確的目的地址。因此,偽報頭中包含IP地址並且作為計算校驗和需要考慮的一部分。最終目的端根據偽報頭和數據單元計算校驗和以驗證通信數據在傳輸過程中沒有改變而且到達了正確的目的地址。)
『肆』 tcp頭部校驗和計算方法的實現需要什麼軟體來實現
以前看計算機網路相關的書,每次看到IP或者UDP報頭校驗和時,都一瞥而過,以為相當簡單,不就是16bit數據的相加嗎。最近在研究《TCP/IP詳解 卷1:協議》這本書,看到校驗和是16bit字的二進制反碼和(暈,以前都沒注意原來是反碼和,看來以前看書不仔細啊!罪過,罪過~~),覺得很奇怪,為什麼會用反碼和,而不是直接求和呢?(因為我認為TCP/IP協議裡面的演算法和思想一般都是非常經典的,人家這么做一定有原因的)下面就來探索一下這個校驗和演算法具體怎麼實現的。 首先,IP、ICMP、UDP和TCP報文頭部都有校驗和欄位,大小都是16bit,演算法也基本一樣: 在發送數據時,為了計算數據包的校驗和。應該按如下步驟: (1)把校驗和欄位置為0; (2)把需校驗的數據看成以16位為單位的數字組成,依次進行二進制反碼求和; (3)把得到的結果存入校驗和欄位中。 在接收數據時,計算數據包的校驗和相對簡單,按如下步驟: (1)把首部看成以16位為單位的數字組成,依次進行二進制反碼求和,包括校驗和欄位; (2)檢查計算出的校驗和的結果是否為0; (3)如果等於0,說明被整除,校驗是和正確。否則,校驗和就是錯誤的,協議棧要拋棄這個數據包。 雖然上面四種報文的校驗和演算法一樣,但在作用范圍存在不同:IP校驗和只校驗20位元組的IP報頭;而ICMP校驗和覆蓋整個報文(ICMP報頭+ICMP數據);UDP和TCP校驗和不僅覆蓋整個報文,而且還有12位元組的IP偽首部,包括源IP地址(4位元組)、目的IP地址(4位元組)、協議(2位元組,第一位元組補0)和TCP/UDP包長(2位元組)。另外UDP、TCP數據報的長度可以為奇數位元組,所以在計算校驗和時需要在最後增加填充位元組0(注意,填充位元組只是為了計算校驗和,可以不被傳送)。 這里還要提一點,UDP的校驗和是可選的,當校驗和欄位為0時,表明該UDP報文未使用校驗和,接收方就不需要校驗和檢查了!那如果UDP校驗和的計算結果是0時怎麼辦呢?書上有這么一句話:如果校驗和的計算結果為0,則存入的值為全1(65535),這在二進制反碼計算中是等效的。 講了這么多,那這個校驗和到底是怎麼算的呢? 1. 什麼是二進制反碼求和 對一個無符號的數,先求其反碼,然後從低位到高位,按位相加,有溢出則向高位進1(跟一般的二進制加法規則一樣),若最高位有進位,則向最低位進1。 首先這里的反碼好像跟我們以前學的有符號數的反碼不一樣(即正數的反碼是其本身,負數的反碼是在其原碼的基礎上,符號位不變,其餘各位取反),這里不分正負數,直接每個位都取反! 下面再舉例兩種二進制反碼求和的運算: 原碼加法運算 反碼加法運算 3(0011)+ 5(0101)= 8(1000) 3(1100)+ 5(1010)= 8(0111) 8(1000)+ 9(1001)= 1(0001) 8(0111)+ 9(0110)= 2(1101) 從上面兩個例子可以看出,當加法未發生溢出時,原碼與反碼加法運算結果一樣;當有溢出時,結果就不一樣了,原碼是滿10000溢出,而反碼是滿1111溢出,所以相差正好是1。舉例只是為了形象地觀察二進制反碼求和的運算規則,至於為什麼要定義這樣的規則以及該運算規則還存在其它什麼特性,可能就需要涉及代數理論的東西的了(嗚嗚~~數學理論沒學好啊,只能從表面上分析分析)。 另外關於二進制反碼求和運算需要說明的一點是,先取反後相加與先相加後取反,得到的結果是一樣的!(事實上我們的編程演算法里,幾乎都是先相加後取反。) 2. 校驗和演算法的實現 講了什麼是二進制反碼求和,那麼校驗和的演算法實現就簡單多了。廢話少說,直接上代碼: 復制代碼代碼如下: [cpp] view plain //計算校驗和 USHORT checksum(USHORT *buffer,int size) { unsigned long cksum=0; while(size1) { cksum+=*buffer++; size-=sizeof(USHORT); } if(size) { cksum+=*(UCHAR *)buffer; } //將32位數轉換成16 while (cksum16) cksum=(cksum16)+(cksum 0xffff); return (USHORT) (~cksum); } buffer是指向需校驗數據緩存區的指針,size是需校驗數據的總長度(位元組為單位) 4~13行代碼對數據按16bit累加求和,由於最高位的進位需要加在最低位上,所以cksum必須是32bit的unsigned long型,高16bit用於保存累加過程中的進位;另外代碼10~13行是對size為奇數情況的處理! 14~16行代碼的作用是將cksum高16bit的值加到低16bit上,即把累加中最高位的進位加到最低位上。這里使用了while循環,判斷cksum高16bit是否非零,因為第16行代碼執行的時候,仍可能向cksum的高16bit進位。有些地方是通過下面兩條代碼實現的:cksum = (cksum 16) + (cksum 0xffff); cksum += (cksum 16);這里只進行了兩次相加,即可保證相加後cksum的高16位為0,兩種方式的效果一樣。事實上,上面的循環也最多執行兩次! 17行代碼即對16bit數據累加的結果取反,得到二進制反碼求和的結果,然後函數返回該值。
『伍』 計算校驗和函數,解析每句的意思
/**
input :
USHORT *pBuf:數據指針
int iSize :數據長度
*/
USHORT checksum(USHORT *pBuf,int iSize)
{
unsigned long cksum=0; //累加和初始值
while(iSize>1) //多少個USHORT型數據
{
cksum+=*pBuf++; //算計累加和
iSize-=sizeof(USHORT); //個數-1
}
if(iSize) //如果有非對齊的下余數據
{
cksum+=*(UCHAR *)pBuf; //+餘下的數值
}
cksum=(cksum>>16)+(cksum&0xffff); //高16位+低16位
cksum+=(cksum>>16); // >=10000再+1
return (USHORT)(~cksum); // 返回它的反(USHORT型)
//這里是把cksum做個轉換,防止別人反向操作?
}
『陸』 校驗和求計算計算過程最好給我講下
校驗和演算法
unsignedshortcheck_sum(unsignedshort*addr,intlen)
{
registerintnleft=len;
registerintsum=0;
registershort*w=addr;
shortanswer=0;
while(nleft>1)
{
sum+=*w++;
nleft-=2;
}
if(nleft==1)
{
*(unsignedchar*)(&answer)=*(unsignedchar*)w;
sum+=answer;
}
sum=(sum>>16)+(sum&0xffff);
sum+=(sum>>16);
answer=~sum;
return(answer);
}
首先,IP、ICMP、UDP和TCP報文頭都有檢驗和欄位,大小都是16bit,演算法基本上也是一樣的。
在發送數據時,為了計算數據包的檢驗和。應該按如下步驟:
1、把校驗和欄位設置為0;
2、把需要校驗的數據看成以16位為單位的數子組成,依次進行二進制反碼求和;
3、把得到的結果存入校驗和欄位中
在接收數據時,計算數據包的檢驗和相對簡單,按如下步驟:
1、把首部看成以16位為單位的數字組成,依次進行二進制反碼求和,包括校驗和欄位;
2、檢查計算出的校驗和的結果是否為0;
3、如果等於0,說明被整除,校驗和正確。否則,校驗和就是錯誤的,協議棧要拋棄這個數據包。
雖然說上面四種報文的校驗和演算法一樣,但是在作用范圍存在不同:IP校驗和只校驗20位元組的IP報頭;而ICMP校驗和覆蓋整個報文(ICMP報頭+ICMP數據);UDP和TCP校驗和不僅覆蓋整個報文,而且還有12個位元組的IP偽首部,包括源IP地址(4位元組)、目的IP地址(4位元組)、協議(2位元組)、TCP/UDP包長(2位元組)。另外UDP、TCP數據報的長度可以為奇數位元組,所以在計算校驗和時需要在最後增加填充位元組0(填充位元組只是為了計算校驗和,可以不被傳送)。
在UDO傳輸協議中,校驗和是可選的,當校驗和欄位為0時,表明該UDP報文未使用校驗和,接收方就不需要校驗和檢查了!那如果UDP校驗和的計算結果是0時怎麼辦?書上有一句話:「如果校驗和的計算結果為0,則存入的值為全1(65535),這在二進制反碼計算中是等效的」
那麼校驗和到底怎麼計算了?
1、什麼是二進制反碼求和
對一個無符號的數,先求其反碼,然後從低位到高位,按位相加,有益處則向高位進1(和一般的二進製法則一樣),若最高位有進位,則向最低位進1.
首先這里的反反碼好像和以前學的有符號反碼不一樣,這里不分正負數,直接每個為都取反。
上面加粗的那句話和我們平時的加法法則不一樣,最高位有進位,則向最低位進1。確實有些疑惑,為什麼要這樣呢?自習分析一下,上面的這種操作,使得在發送加法進位溢出時,溢出值並不是10000,而是1111.也即是當相加結果滿1111時溢出,這樣也可以說明為什麼0000和1111都表示0了。
下面是兩種二進制反碼求和的運算:
原碼加法運算:3(0011)+5(0101)=8(1000)
8(1000)+9(1001)=1(0001)
反碼加法運算:3(1100)+5(1010)=8(0111)
8(0111)+9(0110)=2(1101)
從上面的例子中,當加法未發生溢出時,原碼與反碼加法運算結果一樣;當有溢出時,結果就不一樣了,原碼是滿10000溢出,而反碼是滿1111溢出,所以相差正好是1.
詳細代碼
『柒』 c語言計算檢驗和。。。。。。。。
第一段是將高nleft/2位的數字累加第二段式說 如果nleft=1 sum等於 w的高位第三段 將sum的高十六位移到地十六位 並與原sum的低16位相加然後再把得到的這個數取反 至於這句話sum+=(sum>>16); 我也沒太看懂sum已經剩下低16位了再右移不久是0了嗎 加0有什麼意義呢?這大概是一個校驗碼的生成方法你對照這個方法看代碼應該就很容易理解了我現在看代碼也就是看看代碼再干什麼
『捌』 如何計算串列通信中的校驗和
是的,這個數據加起來後會發給從機(主機),從機會把它收到的數據也加起來和其比較,這樣就可以校驗了。