第五篇:主機位元組序與網路位元組序的轉換

穆晨發表於2017-01-29

前言

       我們知道,資料在主機內的存放有兩種模式,也就是說,主機位元組序有兩種:大端和小端( 這裡假定讀者已經清楚這個問題 )。但在網路通訊中,要求通訊資料( 通訊資料這裡指IP號和埠號 )的使用必須用網路位元組序。什麼又是網路位元組序?

       網路位元組序可以理解為主機位元組序的大端模式。如果你的主機位元組序原本就是大端模式,那麼你可以考慮不用將通訊資料轉換為網路位元組序;但如果你的主機位元組序是小端,那麼通訊資料必須被下面提及到的其中某個函式進行處理,轉換成網路位元組序後方可使用( 即存放進套接字地址結構變數 )。

檢視主機位元組序

       執行下面一段小程式即可檢視你的主機位元組序( 註釋略 )

 1 #include <stdio.h>
 2 
 3 int main(int argc, char **argv)
 4 {
 5     union {
 6         short s;
 7         char c[sizeof(short)];
 8     } un;
 9 
10     un.s = 0x0102;
11     if (un.c[0] == 1 && un.c[1] == 2) {
12         puts("位元組序為小端");
13     }
14     else if (un.c[0] == 2 && un.c[1] == 1) {
15         puts("位元組序為大端");
16     }
17     else {
18         puts("位元組序未知");
19     }
20 
21     return 0;
22 }

本機執行情況:

       

轉換函式

       以下幾個轉換函式均包含在標頭檔案 netinet/in.h 中

       1. uint16_t htons ( uint16_t host16bitvalue )

       將16位的主機位元組序無符號整型變數轉換為網路位元組序格式

       2. uint32_t htonl ( uint32_t host32bitvalue )

       將32位的主機位元組序無符號整型變數轉換為網路位元組序格式

       3. uint16_t ntohs ( uint16_t net16bitvalue )

       將16位的網路位元組序無符號整型變數轉換為主機位元組序格式

       4. uint32_t ntohl ( uint32_t net32bitvalue )

       將32位的網路位元組序無符號整型變數轉換為主機位元組序格式

說明

       以上函式中" h "代表主機位元組序;" n "代表網路位元組序;" s "代表16位的無符號整型變數( 往往是埠 );" l “代表32位的無符號整型變數( 往往是Ipv4地址 )。

相關文章