不幸的是,并不是所有的計算機都以相同的順序存儲包含多字節(jié)值的字節(jié)??紤]一個由2個字節(jié)組成的16位internet。有兩種方法來存儲這個值。
Little Endian?? 在這種方案中,低階字節(jié)存儲在起始地址(A)上,高階字節(jié)存儲在下一個地址(A + 1)上。
Big Endian?- 在這種方案中,高階字節(jié)存儲在起始地址(A)上,低階字節(jié)存儲在下一個地址(A + 1)上。
為了允許使用不同字節(jié)順序約定的機器相互通信,Internet協(xié)議為在網(wǎng)絡上傳輸?shù)臄?shù)據(jù)指定了規(guī)范的字節(jié)順序約定。這就是所謂的網(wǎng)絡字節(jié)順序。
在建立Internet套接字連接時,必須確保sockaddr_in結構的sin_port和sin_addr成員中的數(shù)據(jù)是以網(wǎng)絡字節(jié)順序表示的。
Byte Ordering Functions
在主機的內部表示和網(wǎng)絡字節(jié)順序之間轉換數(shù)據(jù)的例程如下
htons()??Host to Network Short
htonl()??Host to Network Long
ntohl()??Network to Host Long
ntohs()??Network to Host Short
下面列出了關于這些函數(shù)的更多細節(jié)
unsigned short htons(unsigned short hostshort)?? 該函數(shù)將16位(2字節(jié))數(shù)量從主機字節(jié)順序轉換為網(wǎng)絡字節(jié)順序。
unsigned long htonl(unsigned long hostlong)?? 將32位(4字節(jié))的數(shù)量從主機字節(jié)順序轉換為網(wǎng)絡字節(jié)順序。
unsigned short ntohs(unsigned short netshort)?? 此函數(shù)將16位(2字節(jié))數(shù)量從網(wǎng)絡字節(jié)順序轉換為主機字節(jié)順序。
unsigned long ntohl(unsigned long netlong)?? 將32位的數(shù)量從網(wǎng)絡字節(jié)順序轉換為主機字節(jié)順序。
這些函數(shù)是宏,并導致將轉換源代碼插入到調用程序中。在little-endian計算機上,代碼將根據(jù)網(wǎng)絡字節(jié)順序更改值。在big-endian機器上,不需要插入代碼,因為不需要;這些函數(shù)被定義為null。
確定主機字節(jié)順序的程序
將以下代碼保存在byteorder.c文件中,然后編譯它并在您的機器上運行它。
在本例中,我們將兩個字節(jié)的值0x0102存儲在短整數(shù)中,然后查看兩個連續(xù)的字節(jié)c[0](地址A)和c[1](地址A + 1),以確定字節(jié)順序。