複製鏈接
請複製以下鏈接發送給好友

htons

鎖定
htons是將整型變量從主機字節順序轉變成網絡字節順序, 就是整數在地址空間存儲方式變為高位字節存放在內存的低地址處。
網絡字節順序是TCP/IP中規定好的一種數據表示格式,它與具體的CPU類型、操作系統等無關,從而可以保證數據在不同主機之間傳輸時能夠被正確解釋,網絡字節順序採用big-endian排序方式。
外文名
htons
應    用
Windows和Linux網絡編程
用    途
將主機字節順序轉為網絡字節順序
big-endian
地址的低位存儲值的高位

目錄

htons概述

在Windows和Linux網絡編程時需要用到的,用來將主機字節順序轉化為網絡字節順序,以Windows下的代碼為例:
#include<winsock2.h>
u_short htons(u_short hostshort);
htons的功能:將一個無符號短整型的主機數值轉換為網絡字節順序,即大尾順序(big-endian)
參數u_short hostshort:16位無符號整數
返回值:TCP/IP網絡字節順序.
不同的CPU有不同的字節順序類型,這些字節順序類型指的是整數在內存中保存的順序,即主機字節順序。常見的有兩種:
序號
英文名
中文名
描述
1
big-endian
大尾順序
地址的低位存儲值的高位
2
little-endian
小尾順序
地址的低位存儲值的低位

htons示例

例1
而我們常用的 x86 CPU (intel, AMD) 電腦是 little-endian,也就是整數的低位字節放在內存的低字節處。舉個例子吧。假定你的數據是0x1234,
在網絡字節順序裏 這個數據放到內存中就應該顯示成
addr addr+1
0x12 0x34
而在x86電腦上,數據0x1234放到內存中實際是:
addr addr+1
0x34 0x12
htons 的用處就是把實際主機內存中的整數存放方式調整成網絡字節順序
例2 C++代碼示例
#include <winsock2.h>
#include <iostream>

#pragma comment(lib,"ws2_32.lib") 
using namespace std;
int main(){
    int a = 16, b;
    b = htons(a);
    cout << "a=" << a << endl;
    cout << "b=" << b << endl;
    return 0;
}
運行的結果如圖1
圖1 圖1
解釋一下,數字16的16進制表示為0x0010,數字4096的16進製表示為0x1000。 由於Intel機器是小尾端,存儲數字16時實際順序為1000,存儲4096時實際順序為0010。因此在發送網絡包時為了報文中數據為0010,需要經過htons進行字節轉換。如果用IBM等大尾機器,則沒有這種字節順序轉換,但為了程序的可移植性,也最好用這個函數。

htons其他信息

不同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
[1] 
參考資料
  • 1.    王豔平.Windows 網絡與通信程序設計:人民郵電出版社,2006年1月第1版