字節序分爲大端字節序和小端字節序。大端字節序是指一個整數的高位字節(23~31bit)存儲在內存的低地址處,地位字節(0~7bit)存儲在內存的高地址處。小端字節序則相反,整數的高位字節存放在內存的高地址處,低位字節存放在內存的低地址處。如下圖所示:
那麼,如何判斷是大端字節序還是小端字節序呢?
bool IsLittle()
{
short a=1;
return *(char*)&a == 1;
}
bool IsBig()
{
union
{
short a;
short b;
}ua;
ua.a=1;
return ua.b != 1;
}
現代PC大多采用小端字節序,因此小端字節序又被稱爲主機字節序。當數據在兩臺使用不同字節序的主機之間進行數據傳遞時,必然會發生錯誤。解決辦法是:發送端總要把發送的數據轉化成大端字節序再發送,而接收方知道傳過來的是大端字節序,根據自身採用的字節序進行轉換。因此,大端字節序也稱爲網絡字節序。
Linux提供了4個函數完成主機字節序和網絡字節序的轉化:
#include<netinet/in.h>
unsigned long int htonl(unsigned long int hostlong);
unsigned short int htons(unsigned short int hostshort);
unsigned long int ntohl(unsigned long int netlong);
unsigned short int ntohs(unsigned short int netshort);
htonl表示“host to network long”,即將長整型的主機字節序轉換成網絡字節序數據,以此類推。長整型函數通常用來轉換IP地址,短整型函數用來轉換端口號。