網路程式設計基礎02 — 位元組序瞭解一下
阿新 • • 發佈:2019-01-06
1.大端序和小端序
大端序(Big Endian):高位位元組存放到低位地址;
小端序(Little Endian):高位位元組存放到高位地址;
整數0x12345678採用大端序儲存:
採用小端序儲存:
主機位元組序(Host Byte Order):CPU的資料儲存方式;主流Intel系列的CPU一般採用小端序方式;
網路位元組序(Network Byte Order):由於不同的CPU的主機位元組序可能不同,因此在通過網路傳輸資料時,約定統一用大端序方式;
借用別人總結的一句話方便記憶: “自大的人眼高手低”
2.位元組序轉換函式
#include <arpa/inet.h> /* h:host,主機位元組序; * n:network,網路位元組序; * s:short,2位元組;一般用於埠號轉換; * l:long,4位元組;一般用於IP地址轉換; */ unsigned short htons(unsigned short); unsigned short ntohs(unsigned short); unsigned long htonl(unsigned long); unsigned long ntohl(unsigned long); /* 功能:將字串形式的IP地址轉換為網路位元組序整數; * 引數:string - 字串形式的IP地址; * 返回:成功時返回4位元組的大端序整數,失敗時(無效IP地址)返回INADDR_NONE; */ in_addr_t inet_addr(const char *string); /* 功能:將字串形式的IP地址轉換為網路位元組序整數;僅Linux中存在該函式; * 引數:string - 字串形式的IP地址; * addr - sin_addr結構指標,儲存轉換結果; * 返回:成功時返回1,失敗時返回0; */ int inet_aton(const char *string, struct in_addr *addr); /* 功能:將整數型IP地址轉換為字串形式的IP地址; * 引數:addr - sin_addr結構; * 返回:成功時返回轉換後的字串形式地址,失敗時返回-1; */ char* inet_ntoa(struct in_addr addr);
3.位元組序轉換示例
#include <stdio.h> #include <arpa/inet.h> int main(int argc, char **argv) { unsigned short host_port = 0x1234; unsigned short network_port; unsigned long host_ip = 0x12345678; unsigned long network_ip; network_port = htons(host_port); network_ip = htonl(host_ip); printf("host_port = %#x\n", host_port); printf("network_port = %#x\n", network_port); printf("host_ip = %#x\n", host_ip); printf("network_ip = %#x\n", network_ip); return 0; }
在我的測試機器上執行,輸出結果如下: