不同的cpu有不同的位元組序型別 這些位元組序是指整數在記憶體中儲存的順序 這個叫做主機序
最常見的有兩種
1. little endian:將低序位元組儲存在起始位址
2. big endian:將高序位元組儲存在起始位址
le little-endian
最符合人的思維的位元組序
位址低位儲存值的低位
位址高位儲存值的高位
怎麼講是最符合人的思維的位元組序,是因為從人的第一觀感來說
低位值小,就應該放在記憶體位址小的地方,也即記憶體位址低位
反之,高位值就應該放在記憶體位址大的地方,也即記憶體位址高位
be big-endian
最直觀的位元組序
位址低位儲存值的高位
位址高位儲存值的低位
為什麼說直觀,不要考慮對應關係
只需要把記憶體位址從左到右按照由低到高的順序寫出
把值按照通常的高位到低位的順序寫出
兩者對照,乙個位元組乙個位元組的填充進去
例子:在記憶體中雙字0x01020304(dword)的儲存方式
記憶體位址
4000 4001 4002 4003
le 04 03 02 01
be 01 02 03 04
例子:如果我們將0x1234abcd寫入到以0x0000開始的記憶體中,則結果為
big-endian little-endian
0x0000 0x12 0xcd
0x0001 0x23 0xab
0x0002 0xab 0x34
0x0003 0xcd 0x12
x86系列cpu都是little-endian的位元組序.
網路位元組順序是tcp/ip中規定好的一種資料表示格式,它與具體的cpu型別、作業系統等無關,從而可以保證資料在不同主機之間傳輸時能夠被正確解釋。網路位元組順序採用big endian排序方式。
主機位元組序轉換到網路位元組序列的原理:
網路位元組序列採用低位元組在高位的排列方式,
而x86主機位元組序列採用低位元組在低位的方式
其實只要交換一下就可以實現網路位元組序列和主機位元組序列的轉換,
所以對於上面的函式,htonl和ntohl是一樣的。
h host 主機
n net 網路
l long 長整形
s short 短整形
xtox就是進行資料儲存順序的主機和網路順序的轉換
htonl
和htons分別把無符號長整型和無符號短整型數字轉換成tcp/ip協議規定的統一的網路位元組序的數字,即大頭序。不同體系的計算機儲存數字時有些把最
低位放在前面,另一些相反,即所謂大頭和小頭。數字進入internet時應先用htonl或htons轉換成統一的大頭序。
htonl(將32位主機字元順序轉換成網路字元順序)
定義函式 unsigned long int htonl(unsigned long int hostlong);
函式說明 htonl()用來將引數指定的32位hostlong 轉換成網路字元順序。
返回值 返回對應的網路字元順序。
htons(將16位主機字元順序轉換成網路字元順序)
定義函式 unsigned short int htons(unsigned short int hostshort);
函式說明 htons()用來將引數指定的16位hostshort轉換成網路字元順序。
返回值 返回對應的網路字元順序。
ntohl(將32位網路字元順序轉換成主機字元順序)
定義函式 unsigned long int ntohl(unsigned long int netlong);
函式說明 ntohl()用來將引數指定的32位netlong轉換成主機字元順序。
返回值 返回對應的主機字元順序。
ntohs(將 16位網路字元順序轉換成主機字元順序)
定義函式 unsigned short int ntohs(unsigned short int netshort);
函式說明 ntohs()用來將引數指定的16位netshort轉換成主機字元順序。
返回值 返回對應的主機順序。
比如網路位元組 為 00 01
u_short a; // a=0100; 因為主機是從高位元組到低位元組的,所以應該轉化後
a=ntohs(0001); //這樣 a=0001;
假設你已經有了乙個sockaddr_in結構體ina,你有乙個ip位址"132.241.5.10" 要儲存在其中,你就要用到函式inet_addr(),將ip位址從 點數格式轉換成無符號長整型。使用方法如下:
ina.sin_addr.s_addr = inet_addr(「132.241.5.10″);
注意,inet_addr()返回的位址已經是網路位元組格式,所以你無需再呼叫函式htonl()。
inet_addr(將網路位址轉成二進位制的數字)
定義函式 unsigned long int inet_addr(const char *cp);
函式說明 inet_addr()用來將引數cp所指的網路位址字串轉換成網路所使用的二進位制數字。網路位址字串是以數字和點組成的字串,例如:「163.13.132.68」。
返回值 成功則返回對應的網路二進位制的數字,失敗返回-1。
//ntoa:network to ascii
//aton:ascii to network
inet_aton(將網路位址轉成網路二進位制的數字)
定義函式 int inet_aton(const char * cp,struct in_addr *inp);
函式說明 inet_aton()用來將引數cp所指的網路位址字串轉換成網路使用的二進位制的數字,然後存於引數inp所指的in_addr結構中。
結構 in_addr定義如下
struct in_addr
;返回值 成功則返回非0值,失敗則返回0。
inet_ntoa(將網路二進位制的數字轉換成網路位址)
定義函式 char * inet_ntoa(struct in_addr in);
函式說明 inet_ntoa()用來將引數in所指的網路二進位制的數字轉換成網路位址,然後將指向此網路位址字串的指標返回。( 將網路位址轉換成「.」點隔的字串格式)
返回值 成功則返回字串指標,失敗則返回null。
主機序和網路序
不同的cpu有不同的位元組序型別 這些位元組序是指整數在記憶體中儲存的順序 這個叫做主機序 最常見的有兩種 1 little endian 將低序位元組儲存在起始位址 2 big endian 將高序位元組儲存在起始位址 le little endian 最符合人的思維的位元組序 位址低位儲存值的低...
主機序和網路序以及使用例子
為什麼存在這兩個東西 空中傳輸的位元組的順序即網路位元組序為標準順序,考慮到與協議的一致以及與同類其它平台產品的互通,在程式中發資料報時,將主機位元組序轉換為網路位元組序,收資料報處將網路字 節序轉換為主機位元組序 網路程式開發時 或是跨平台開發時 應該注意保證只用一種位元組序 不然兩方的解釋不一樣...
主機位元組序和網路位元組序(大端序,小端序,網路序)
根據cpu的不同我們可以把主機位元組序在記憶體中儲存的順序叫做主機序,也就是我們常說的,大端機和小端機。我們經常看到的有兩種 1.小端機 記憶體中以小端序儲存的機器 將低位元組序儲存在開始的位址 及記憶體較小的記憶體 舉個例子 我們將記憶體從左到右排列 在記憶體中存放0x01020304 2000 ...