網路位元組序

2022-04-04 18:53:45 字數 921 閱讀 9130

我們已經知道,記憶體中的多位元組資料相對於記憶體位址有大端和小端之分,磁碟檔案中的多位元組資料相對於檔案中的偏移位址也有大端小端之分。網路資料流同樣有大端小端之分,那麼如何定義網路資料流的位址呢?傳送主機通常將傳送緩衝區中的資料按記憶體位址從低到高的順序發出,接收主機把從網路上接到的位元組依次儲存在接收緩衝區中,也是按記憶體位址從低到高的順序儲存,因此,網路資料流的位址應這樣規定:先發出的資料是低位址,後發出的資料是高位址。

tcp/ip協議規定,網路資料流應採用大端位元組序,即低位址高位元組。例如上一節的udp段格式,位址0-1是16位的源埠號,如果這個埠號是1000(0x3e8),則位址0是0x03,位址1是0xe8,也就是先發0x03,再發0xe8,這16位在傳送主機的緩衝區中也應該是低位址存0x03,高位址存0xe8。但是,如果傳送主機是小端位元組序的,這16位被解釋成0xe803,而不是1000。因此,傳送主機把1000填到傳送緩衝區之前需要做位元組序的轉換。同樣地,接收主機如果是小端位元組序的,接到16位的源埠號也要做位元組序的轉換。如果主機是大端位元組序的,傳送和接收都不需要做轉換。同理,32位的ip位址也要考慮網路位元組序和主機位元組序的問題。

為使網路程式具有可移植性,使同樣的c**在大端和小端計算機上編譯後都能正常執行,可以呼叫以下庫函式做網路位元組序和主機位元組序的轉換。

#include (將數值轉換成數值)

uint32_t htonl(uint32_thostlong);

uint16_t htons(uint16_thostshort);

uint32_t ntohl(uint32_tnetlong);

uint16_t ntohs(uint16_tnetshort);

h表示host,n表示network,l表示32位長整數,s表示16位短整數。

如果主機是小端位元組序,這些函式將引數做相應的大小端轉換然後返回,如果主機是大端位元組序,這些函式不做轉換,將引數原封不動地返回。

位元組序和網路位元組序

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...