概述
在Windows和Linux網路編程時需要用到的,用來將主機位元組順序轉化為網路位元組順序,以Windows下的代碼為例:
htons的功能:將一個無符號短整型的主機數值轉換為網路位元組順序,即大尾順序(big-endian)
參數u_short hostshort:16位無符號整數
返回值:TCP/IP網路位元組順序.
不同的CPU有不同的位元組順序類型,這些位元組順序類型指的是整數在記憶體中保存的順序,即主機位元組順序。常見的有兩種:
序號 | 英文名 | 中文名 | 描述 |
1 | big-endian | 大尾順序 | 地址的低位存儲值的高位 |
2 | little-endian | 小尾順序 | 地址的低位存儲值的低位 |
示例
例1
而我們常用的 x86 CPU (intel, AMD) 電腦是 little-endian,也就是整數的低位位元組放在記憶體的低位元組處。舉個例子吧。假定你的數據是0x1234,
在網路位元組順序里 這個數據放到記憶體中就應該顯示成
addr addr+1
0x12 0x34
而在x86電腦上,數據0x1234放到記憶體中實際是:
addr addr+1
0x34 0x12
htons 的用處就是把實際主機記憶體中的整數存放方式調整成網路位元組順序。
例2
我們在Intel機器下,執行以下程式
運行的結果如下圖

解釋一下,數字16的16進制表示為0x0010,數字4096的16進制表示為0x1000。 由於Intel機器是小尾端,存儲數字16時實際順序為1000,存儲4096時實際順序為0010。因此在傳送網路包時為了報文中數據為0010,需要經過htons進行位元組轉換。如果用IBM等大尾機器,則沒有這種位元組順序轉換,但為了程式的可移植性,也最好用這個函式。
Tips
不同CPU上運行不同的作業系統,其主機位元組順序也是不同,參見下表:
處理器 | 作業系統 | 位元組順序 |
Alpha | 全部 | little-endian |
HP-PA | NT | little-endian |
HP-PA | UNIX | big-endian |
Intelx86 | 全部 | little-endian |
MIPS | NT | little-endian |
MIPS | UNIX | big-endian |
PowerPC | NT | little-endian |
PowerPC | 非NT | big-endian |