1. 程式人生 > >socket程式設計 -- 大端小端區別及轉換

socket程式設計 -- 大端小端區別及轉換

計算機資料儲存有兩種位元組優先順序:高位位元組優先(稱為大端模式)和低位位元組優先(稱為小端模式)。

記憶體的低地址儲存資料的低位元組,高地址儲存資料的高位元組的方式叫小端模式。

記憶體的高地址儲存資料的低位元組,低地址儲存資料高位元組的方式稱為大端模式。

例子:對於記憶體中存放的數0x12345678來說
如果是採用大端模式存放的,則其真實的數是:0x12345678
如果是採用小端模式存放的,則其真實的數是:0x78563412

如果稱某個系統所採用的位元組序為主機位元組序,則它可能是小端模式的,也可能是大端模式的。
而埠號和IP地址都是以網路位元組序儲存的,不是主機位元組序,網路位元組序都是大端模式。
要把主機位元組序和網路位元組序相互對應起來,需要對這兩個位元組儲存優先順序進行相互轉化。
這裡用到四個函式:htons(),ntohs(),htonl()和ntohl().


這四個地址分別實現網路位元組序和主機位元組序的轉化,這裡的h代表host,n代表network,s代表short,l代表long。
通常16位的IP埠號用s代表,而IP地址用l來代表。

#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 相反。