大端模式與小端模式 網路位元組序與主機位元組序

2021-06-05 21:55:50 字數 2769 閱讀 1295

大端模式與小端模式

三、大端小端轉換方法:

big-endian轉換成little-endian如下:

#define bigtolittle16(a)                 ((((uint16)(a) & 0xff00) >> 8) | \

(((uint16)(a) & 0x00ff) << 8))

#define bigtolittle32(a)                 ((((uint32)(a) & 0xff000000) >> 24) | \

(((uint32)(a) & 0x00ff0000) >> 8) | \

(((uint32)(a) & 0x0000ff00) << 8) | \

(((uint32)(a) & 0x000000ff) << 24))

四、大端小端檢測方法:

如何檢查處理器是big-endian還是little-endian?

聯合體union的存放順序是所有成員都從低位址開始存放,利用該特性就可以輕鬆地獲得了cpu對記憶體採用little-endian還是big-endian模式讀寫。

int checkcpuendian()

c;c.a = 1;

return (c.b == 1);

}/*return 1 : little-endian, return 0:big-endian*/ 

網路位元組順序

1、位元組內的位元位不受這種順序的影響

比如乙個位元組 1000 0000 (或表示為十六進製制 80h)不管是什麼順序其記憶體中的表示法都是這樣。

2、大於1個位元組的資料型別才有位元組順序問題

比如 byte a,這個變數只有乙個位元組的長度,所以根據上一條沒有位元組順序問題。所以位元組順序是「位元組之間的相對順序」的意思。

3、大於1個位元組的資料型別的位元組順序有兩種

比如 short b,這是乙個兩位元組的資料型別,這時就有位元組之間的相對順序問題了。

網路位元組順序是「所見即所得」的順序。而intel型別的cpu的位元組順序與此相反。

比如上面的 short b=0102h(十六進製制,每兩位表示乙個位元組的寬度)。所見到的是「0102」,按一般數學常識,數軸從左到右的方向增加,即記憶體位址從左到右增加的話,在記憶體中這個 short b的位元組順序是:

01 02

這就是網路位元組順序。所見到的順序和在記憶體中的順序是一致的!

而相反的位元組順序就不同了,其在記憶體中的順序為:02 01

假設通過抓包得到網路資料的兩個位元組流為:01 02

如果這表示兩個 byte型別的變數,那麼自然不需要考慮位元組順序的問題。

如果這表示乙個 short 變數,那麼就需要考慮位元組順序問題。根據網路位元組順序「所見即所得」的規則,這個變數的值就是:0102

假設本地主機是intel型別的,那麼要表示這個變數,有點麻煩:

定義變數 short x,

位元組流位址為:pt,按順序讀取記憶體是為

x=*((short*)pt);

那麼x的記憶體順序當然是 01 02

按非「所見即所得」的規則,這個記憶體順序和看到的一樣顯然是不對的,所以要把這兩個位元組的位置調換。

調換的方法可以自己定義,但用已經有的api還是更為方便。

網路位元組順序與主機位元組順序

nbo與hbo 網路位元組順序nbo(network byte order):按從高到低的順序儲存,在網路上使用統一的網路位元組順序,可以避免相容性問題。主機位元組順序(hbo,host byte order):不同的機器hbo不相同,與cpu設計有關計算機資料儲存有兩種位元組優先順序:高位位元組優先和低位位元組優先。internet上資料以高位位元組優先順序在網路上傳輸,所以對於在內部是以低位位元組優先方式儲存資料的機器,在internet上傳輸資料時就需要進行轉換。 

htonl()

簡述:將主機的無符號長整形數轉換成網路位元組順序。

#include

u_long pascal far htonl( u_long hostlong);

hostlong:主機位元組順序表達的32位數。

注釋:本函式將乙個32位數從主機位元組順序轉換成網路位元組順序。

返回值:

htonl()返回乙個網路位元組順序的值。

inet_ntoa()

簡述:將網路位址轉換成「.」點隔的字串格式。

#include

char far* pascal far inet_ntoa( struct in_addr in);

in:乙個表示internet主機位址的結構。

注釋:本函式將乙個用in引數所表示的internet位址結構轉換成以「.」 間隔的諸如「a.b.c.d」的字串形式。請注意inet_ntoa()返回的字串存放在windows套介面實現所分配的記憶體中。應用程式不應假設該記憶體是如何分配的。在同乙個執行緒的下乙個windows套介面呼叫前,資料將保證是有效。

返回值:

若無錯誤發生,inet_ntoa()返回乙個字元指標。否則的話,返回null。其中的資料應在下乙個windows套介面呼叫前複製出來。

網路中傳輸的資料有的和本地位元組儲存順序一致,而有的則截然不同,為了資料的一致性,就要把本地的資料轉換成網路上使用的格式,然後傳送出去,接收的時候也是一樣的,經過轉換然後才去使用這些資料,基本的庫函式中提供了這樣的可以進行位元組轉換的函式,如和htons( ) htonl( ) ntohs( ) ntohl( ),這裡n表示network,h表示host,htons( ) htonl( )用於本地位元組向網路位元組轉換的場合,s表示short,即對2位元組操作,l表示long即對4位元組操作。同樣ntohs( )ntohl( )用於網路位元組向本地格式轉換的場合。

大端模式 小端模式與網路位元組序

1.概述 大端模式與小端模式指的是超過乙個位元組大小的資料在計算機記憶體中兩種不同的存放方式。如果將資料的高位,儲存在低位址,則為大端模式 big endian 如果將資料的高位,儲存在高位址,則為小端模式 little endian 兩種存放方式並無明顯的優劣之分,但又同時存在於不同的計算機系統中...

大端模式小端模式以及網路位元組序

大端模式小端模式以及網路位元組序 主機位元組序有兩種 大端模式和小端模式 不同的cpu有不同的主機位元組序型別。典型的使用小端儲存的cpu有 intel x86和arm 典型的使用大端儲存cpu有 power pc mips unix和hp paunix。網路位元組序類似於大端模式,注意是類似,為什...

大端 小端與網路位元組序

大端 big endian 小端 little endian 以及網路位元組序的概念在程式設計中經常會遇到,其中網路位元組序 network byte order 一般是指大端 big endian,對大部分網路傳輸協議而言 傳輸,大端小端的概念是面向多位元組資料型別的儲存方式定義的,小端就是低位在...