主機字節序和網絡字節序

字節序分爲大端字節序和小端字節序。大端字節序是指一個整數的高位字節(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地址,短整型函數用來轉換端口號。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章