htons

htons

htons是將整型變數從主機位元組順序轉變成網路位元組順序, 就是整數在地址空間存儲方式變為高位位元組存放在記憶體的低地址處。 網路位元組順序是TCP/IP中規定好的一種數據表示格式,它與具體的CPU類型、作業系統等無關,從而可以保證數據在不同主機之間傳輸時能夠被正確解釋,網路位元組順序採用big-endian排序方式。

概述

在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機器下,執行以下程式

運行的結果如下圖

htons htons

解釋一下,數字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

相關詞條

相關搜尋

熱門詞條

聯絡我們