1. 程式人生 > >主機字節序和網絡字節序轉換

主機字節序和網絡字節序轉換

數據表 https www sch 定義 本地 style tails art

為什麽要轉換?

主機字節序:整數在內存中保存的順序,不同的處理器對應不容的模式

Little endian 將低序字節存儲在起始地址

Big endian 將高序字節存儲在起始地址

網絡字節序:整數在網絡中的發送順序

網絡字節順序是TCP/IP中規定好的一種數據表示格式,它與具體的CPU類型、操作系統等無關,從而可以保證數據在不同主機之間傳輸時能夠被正確解釋。

網絡字節順序采用big endian排序方式

htons 本地的無符號short型主機字節序轉換為網絡字節序

htonl 本地的無符號long型主機字節序轉化為網絡字節序

ntohs 網絡字節序轉換為本地的無符號short型主機字節序

ntohl 網絡字節序轉換為 本地的無符號long型主機字節序

inet_addr: 將一個點間隔地址轉換成 struct in_addr

inet_ntoa: 將網絡字節序格式IP轉換到字符串

inet_aton: 將字符串轉換到網絡字節序格式IP

inet_pton: 將點十分進制轉換為網絡字節序

atoi: 將字符串轉換為整型數

在使用little endian的系統中 這些函數會把字節序進行轉換
在使用big endian類型的系統中 這些函數會定義成空宏

參考 http://blog.csdn.net/suwei19870312/article/details/5320831

  http://www.360doc.com/content/12/0222/10/54470_188560773.shtml

函數使用需要註意的問題:

IPv4套接口地址數據結構

結構:

struct sockaddr_in {

   short int sin_family;     //IPV4協議為AF_INET

   unsigned short int sin_port; //16位端口號,網絡字節序列

   struct in_addr sin_addr;

   unsigned char sin_zero[8]; //備用域,為了和struct sockaddr字節數保持相同;

  };

struct in_addr{

in_addr_t s_addr;//32位IP地址,網絡字節序列

} ;

參考 https://my.oschina.net/SBaof/blog/477585

主機字節序和網絡字節序轉換