原文:https://www.abell.tophtml
在C/C++寫網絡程序的時候,每每會遇到字節的網絡順序和主機順序的問題。這是就可能用到htons(), ntohl(), ntohs(),htons()這4個函數。編程
網絡字節順序與本地字節順序之間的轉換函數:網絡
htonl()--"Host to Network Long" ntohl()--"Network to Host Long" htons()--"Host to Network Short" ntohs()--"Network to Host Short"
之因此須要這些函數是由於計算機數據表示存在兩種字節順序:NBO與HBO函數
網絡字節順序NBO(Network Byte Order):
按從高到低的順序存儲,在網絡上使用統一的網絡字節順序,能夠避免兼容性問題。ui
主機字節順序(HBO,Host Byte Order):
不一樣的機器HBO不相同,與CPU設計有關,數據的順序是由cpu決定的,而與操做系統無關。
如 Intelx86結構下,short型數0x1234表示爲34 12, int型數0x12345678表示爲78 56 34 12如IBM power PC結構下,short型數0x1234表示爲12 34, int型數0x12345678表示爲12 34 56 78
因爲這個緣由不一樣體系結構的機器之間沒法通訊,因此要轉換成一種約定的數序,也就是網絡字節順序,其實就是如同powerpc那樣的順序 。在PC開發中有ntohl和htonl函數能夠用來進行網絡字節和主機字節的轉換。 spa
2.操作系統
在Linux和Windows網絡編程時須要用到htons和htonl函數,用來將主機字節順序轉換爲網絡字節順序。.net
在Intel機器下,執行如下程序設計
int main() { printf("%d \n",htons(16)); return 0; }
獲得的結果是4096,初一看感受很怪。unix
解釋以下,數字16的16進製表示爲0x0010,數字4096的16進製表示爲0x1000。 因爲Intel機器是小尾端,存儲數字16時實際順序爲1000,存儲4096時實際順序爲0010。所以在發送網絡包時爲了報文中數據爲0010,須要 通過htons進行字節轉換。若是用IBM等大尾端機器,則沒有這種字節順序轉換,但爲了程序的可移植性,也最好用這個函數。
另外用注意,數字所佔位數小於或等於一個字節(8 bits)時,不要用htons轉換。這是由於對於主機來講,大小尾端的最小單位爲字節(byte)。
包含的頭文件爲:"winsock2.h"