1. 程式人生 > >網路程式設計基礎02 — 位元組序瞭解一下

網路程式設計基礎02 — 位元組序瞭解一下

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;
}

在我的測試機器上執行,輸出結果如下:
在這裡插入圖片描述