網路位元組序
一.位元組序
位元組序是由於不同的主處理器和作業系統,對大於乙個位元組的變數在記憶體中的存放順序不同而產生的。
位元組序通常有大端位元組序列和小端位元組序兩種分類方法。
由於主機的千差萬別,主機的位元組序不能做到統一,但是網路上傳輸的數值,它們有統一的規定。網路位元組序:是指多位元組變數在網路傳輸時的表示方法,網路位元組序採用高階位元組序的表示方法。
二.大端位元組序和小端位元組序
位元組序是由於cpu和os對多位元組變數的記憶體儲存順序不同而產生的。
1.briefintroduce:
乙個16位的整數,它由兩個位元組構成,在有的系統上會將高位元組放在記憶體的低位址上,而有的系統上則將高位元組放在記憶體的高位址上,所以存在位元組序的問題。
2.位元組序的表示方法有兩種:
1>小端位元組序(little endian):在表示變數的記憶體起始位址存放底位元組,高位元組順序存放
2>大端位元組序(big endian):在表示變數的記憶體起始位址存放高位元組,底位元組順序存放。
3例項:
乙個變數的值為0xabcd,在大端位元組序和小端位元組序的系統中兩者的存放順序是不同的.
1>在小端位元組系統中的存放順序如圖:
0xab在位址15~8的位址上,而0xcd在位址7~0的位置上。
2>在大端位元組序系統中的存放順序如圖:
4.程式例項:
可以編寫程式來檢測下變數在記憶體中的表示形式,以確定系統中的位元組序為大端位元組序還是小端位元組序。
(1)位元組序結構:
程式先建立乙個公用體型別address,用於測試位元組序,成員value是int 型別變數,可以通過成員byte來訪問value變數的高位元組和低位元組。
typedef unionaddr;
(2)變數宣告,宣告乙個to型別的變數typeordr,給變數value賦值為0xabcd,由於在型別addr中,value和byte成員共享同一塊記憶體,所以可以通過byte的不同成員來訪問value的高位元組和低位元組。
(3)程式:
int main(int argc,char *argv)
/*大端位元組序判斷*/
if(typeorder.byte[0] == 0xab &&typeorder.byte[1]==0xcd)
return 0; }
5.進行網路位元組序轉換的函式有htons,htonl,ntohs(),ntohl()等,其中s表示short資料型別,l是long資料型別的意思,h是host既主機的意思,n是network即網路的意思。
1>htons(host to net short):表示對short型別的變數,從主機位元組序轉換為網路位元組序。
2>ntohs(net to host short):表示對short型別的變數,從網路位元組序轉換為主機位元組序。
3>htonl(host to net long):表示對long型別的變數,從主機位元組序轉換為網路位元組序
4>ntohl(net to host long):表示對long型別的變數,從網路位元組序轉換為主機位元組序。
6.由於在網路中網路位元組序採用高階位元組序的表示方法。因此位元組序轉換函式在不同平台上的實現是不同的,在小端主機位元組序的平台要進行轉換,而在大端主機位元組序的平台上是不需要進行轉換的。
例如:通過下面的實現方式可以相容不同的平台:
#if isle
/*小端位元組序平台呼叫此部分***/
long htonl(longvalue)
#else if isbe
/*大端位元組序平台呼叫此部分***/
long htonl(longvalue)
#endif
位元組序和網路位元組序
1 位元組序 由於不同的計算機系統採用不同的位元組序儲存資料,同樣乙個4位元組的32位整數,在記憶體中儲存的方式就不同.位元組序分為小尾位元組序 little endian 和大尾位元組序 big endian intel處理器大多數使用小尾位元組序,motorola處理器大多數使用大尾 big e...
位元組序和網路位元組序
1位元組序 由於不同的計算機系統採用不同的位元組序儲存資料,同樣乙個4位元組的32位整數,在記憶體中儲存的方式就不同.位元組序分為小尾位元組序 little endian 和大尾位元組序 big endian intel處理器大多數使用小尾位元組序,motorola處理器大多數使用大尾 big en...
位元組序與網路位元組序
cpu向記憶體儲存資料的方式有2種,這意味著cpu解析資料的方式也分為2種 0x20號 0x21號 0x22號 0x23號 0x12 0x32 0x56 0x78 整數0x12345678,0x12是最高位位元組,0x78是最低位位元組。因此大端中先儲存最高位位元組0x12,小端序儲存方式如下 0x...