htonl(),htons(),ntohl(),ntons()--大小端模式轉換函數
原文:https://qiuye.iteye.com/blog/844764
不同機器內部對變量的字節存儲順序不同,有的采用大端模式(big-endian),有的采用小端模式(little-endian)。
大端模式是指高字節數據存放在低地址處,低字節數據放在高地址處。
小端模式是指低字節數據存放在低地址處,高字節數據放在高地址處。
在網絡上傳輸數據時,由於數據傳輸的兩端可能對應不同的硬件平台,采用的存儲字節順序也可能不一致,因此 TCP/IP 協議規定了在網絡上必須采用網絡字節順序(也就是大端模式) 。
通過對大小端的存儲原理分析可發現,對於 char 型數據,由於其隻占一個字節,所以不存在這個問題,這也是一般情況下把數據緩衝區定義成 char 類型 的原因之一。對於
IP 地址、端口號等非 char 型數據,必須在數據發送到網絡上之前將其轉換成大端模式,在接收到數據之後再將其轉換成符合接收端主機的存儲模式。
Linux 係統為大小端模式的轉換提供了 4 個函數,輸入 man byteorder 命令可得函數原型:
#include <arpa/inet.h> uint32_t htonl(uint32_t hostlong); uint16_t htons(uint16_t hostshort); uint32_t ntohl(uint32_t netlong); uint16_t ntohs(uint16_t netshort);
htonl 表示 host to network long ,用於將主機 unsigned int 型數據轉換成網絡字節順序;
htons 表示 host to network short ,用於將主機 unsigned short 型數據轉換成網絡字節順序;
ntohl、ntohs 的功能分別與 htonl、htons 相反。
最後更新:2017-04-02 06:52:03