linux網路程式設計 網路位元組序 位址轉換

2021-07-05 07:43:16 字數 3650 閱讀 7735

「endian」這個詞出自《格列佛遊記》。小人國的內戰就源於吃雞蛋時是究竟從大頭(big-endian)敲開還是從小頭(little-endian)敲開,由此曾發生過六次叛亂,其中乙個皇帝送了命,另乙個丟了王位。

我們一般將「endian」翻譯成「位元組序」,將 big-endian 和 little-endian 稱作「大端格式」和「小端格式」。

位元組序是指多位元組資料的儲存順序,在設計計算機系統的時候,有兩種處理記憶體中資料的方法:大端格式、小端格式。

小端格式(little-endian):將低位位元組資料儲存在低位址。

大端格式(big-endian):將高位位元組資料儲存在低位址。

舉個簡單的例子,對於整形 0x12345678,它在大端格式和小端格式的系統中,分別如下圖所示的方式存放:

下面例子為確定主機的位元組序:

#include int main(int argc, char *argv)

輸出結果為:

[root@localhost 9network]# ./a.out 

little endian...

[root@localhost 9network]#

。只有在多位元組資料處理時才需要考慮位元組序,執行在同一臺計算機上的程序相互通訊時,一般不用考慮位元組序,異構計算機之間通訊,需要轉換自己的位元組序為網路位元組序。

以下介面所需標頭檔案:#include

uint32_t htonl(uint32_t hostint32);

功能:

將 32 位主機位元組序資料轉換成網路位元組序資料

引數:

hostint32:需要轉換的 32 位主機位元組序資料,uint32_t 為 32 為無符號整型

返回值:

成功:返回網路位元組序的值

uint16_t htons(uint16_t hostint16);功能:

將 16 位主機位元組序資料轉換成網路位元組序資料

引數:

hostint16:需要轉換的 16 位主機位元組序資料,uint16_t,unsigned short int

返回值:

成功:返回網路位元組序的值

測試示例:

#include #include int main(int argc, char *argv)

執行結果如下:

功能:

將 32 位網路位元組序資料轉換成主機位元組序資料

引數:

netint32:待轉換的 32 位網路位元組序資料,uint32_t,unsigned int

返回值:

成功:返回主機位元組序的值

uint16_t ntohs(uint16_t netint16);功能:

將 16 位網路位元組序資料轉換成主機位元組序資料

引數:

netint16:待轉換的 16 位網路位元組序資料,uint16_t,unsigned short int

返回值:

成功:返回主機位元組序的值

以下介面所需標頭檔案:#include

int inet_pton(int family, const char *strptr, void *addrptr);

功能:

將點分十進位制數串轉換成 32 位無符號整數

引數:

family:協議族( af_inet、af_inet6、pf_packet 等 ),常用 af_inet

strptr:點分十進位制數串

addrptr:32 位無符號整數的位址

返回值:

成功返回 1 、 失敗返回其它

測試示例:

#include #include #include #include #include #include int main(void)

執行結果如下:

功能:

將 32 位無符號整數轉換成點分十進位制數串

引數:

family:協議族( af_inet、af_inet6、pf_packet 等 ),常用 af_inet

addrptr:32 位無符號整數

strptr:點分十進位制數串

len:strptr 快取區長度

len 的巨集定義
#define inet_addrstrlen   16  // for ipv4
#define inet6_addrstrlen  46  // for ipv6

返回值:

成功:則返回字串的首位址

失敗:返回 null

測試示例:

#include #include #include #include #include #include int main(int argc, char **argv)

; char buf[16] = ;

inet_ntop(af_inet, ip, buf, 16);

printf("buf: %s\n", buf);

return 0;

}

執行結果如下:

參考**:

Linux網路程式設計 主機位元組序 與 網路位元組序

網域名稱轉換ip位址 首先需要理解大端模式與小端模式這兩個點 這兩種模式代表著資料在記憶體中是如何存放的,我們直到,乙個位元組能夠存放8位,如果是超過8位的資料該怎樣存放呢?如需要存放資料 0x12345678 不難看出,大端模式也就是高位優先存放,小端模式也就是低位優先存放。下面學習兩類函式 ht...

Linux網路程式設計 位元組序

1 談到位元組序,那麼會有朋友問什麼是位元組序 非常easy 比如乙個16位的整數。由2個位元組組成,8位為一位元組,有的系統會將高位元組放在記憶體低的位址上,有的則將低位元組放在記憶體高的位址上,所以存在位元組序的問題。2 那麼什麼是高位元組 低位元組?也相當簡單 乙個16進製制整數有兩個位元組組...

Linux網路程式設計 位元組序

與同一臺計算機上的程序進行通訊時,一般不用考慮位元組序,位元組序是乙個處理器架構特性,用於指示像整數計算的大資料型別內部的位元組如何排序。假設上圖圖 中在記憶體 0x1000 到 0x1003 這連續的 4 個位元組儲存了資料,這段資料對應的資料型別是 int 型別。我們知道 int 型別的資料在大...