python 網路位元組序轉換 網路位元組序

2021-10-18 14:11:30 字數 2375 閱讀 4175

一.位元組序

位元組序是由於不同的主處理器和作業系統,對大於乙個位元組的變數在記憶體中的存放順序不同而產生的。

位元組序通常有大端位元組序列和小端位元組序兩種分類方法。

由於主機的千差萬別,主機的位元組序不能做到統一,但是網路上傳輸的數值,它們有統一的規定。網路位元組序:是指多位元組變數在網路傳輸時的表示方法,網路位元組序採用高階位元組序的表示方法(高位在前,低位在後,這是針對乙個變數所處的位元組中來說的,比如乙個變數佔兩個位元組,則該變數的第乙個位元組值應該放在它所對應的記憶體中的高位位元組)。

二.大端位元組序和小端位元組序

位元組序是由於cpu和os對多位元組變數的記憶體儲存順序不同而產生的。

1.brief introduce:

乙個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 *ar**)

addr typeorder;//乙個to型別的變數

typeorder.value=

0xabcd;

if(typeorder.byte[0] == 0xcd

&&typeorder.byte[1]==0xab){

printf(「low endian bye

order\n」);

printf(「byte[0]:0x%x,byte[1]:0x%x\n」,typeorder.byte[0],typeorder.byte[1]);

if(typeorder.byte[0] == 0xab

&&typeorder.byte[1]==0xcd){

printf(「high

endian byte order\n」);

printf(「byte[0]:0x%x,byte[1]:0x%x\n」,typeorder.byte[0],typeorder.byte[1]);

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(lon**alue)

return ((value << 24) |

((value <<8)&0x00ff0000)

|((value>>8)&0x0000ff00)|(value>>24));

#else if

isbe

long

htonl(lon**alue)

return  value;

#endif

主機位元組序和網路位元組序轉換

為什麼要轉換?主機位元組序 整數在記憶體中儲存的順序,不同的處理器對應不容的模式 little endian 將低序位元組儲存在起始位址 big endian 將高序位元組儲存在起始位址 網路位元組序 整數在網路中的傳送順序 網路位元組順序是tcp ip中規定好的一種資料表示格式,它與具體的cpu型...

網路位元組序與主機位元組序的轉換

在對ip位址結構體sockaddr in賦值的時候,經常會用到下列的函式htonl,htons,inet addr,與之相對應的函式是ntohl,ntohs,inet ntoa。檢視這些函式的解析,會發現這些函式其實是與主機位元組序和網路位元組序之間轉換有關。就是什麼網路位元組序,什麼是主機位元組序...

網路位元組序與主機位元組序的轉換

在對ip位址結構體sockaddr in賦值的時候,經常會用到下列的函式htonl,htons,inet addr,與之相對應的函式是ntohl,ntohs,inet ntoa。檢視這些函式的解析,會發現這些函式其實是與主機位元組序和網路位元組序之間轉換有關。就是什麼網路位元組序,什麼是主機位元組序...