主機字節序:整數在內存中保存的順序
兩種方式:
Little endian 將低序字節存儲在起始地址
Big endian 將高序字節存儲在起始地址
網絡字節序:整數在網絡中的發送順序
標準規定
Big endian 首先發送高位字節
字節序轉換函數
htonl: 轉換long類型到網絡字節序
htons: 轉換short類型到網絡字節序
ntohl: 轉換網絡字節序到long類型
ntohs: 轉換網絡字節序到short類型
inet_addr: 將字符串格式IP轉換到網絡字節序
inet_ntoa: 將網絡字節序格式IP轉換到字符串
舉例:SOCKADDR_IN中的數據格式
SOCKADDR_IN addr;
addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
addr.sin_port = htons(5120);
addr.sin_family = AF_INET;
該結構體中的成員sin_addr, sin_port使用的是網絡字節序
sin_addr:
inet_addr()返回的已經是網絡字節序
127.0.0.1 --> 0x7F.00.00.01
-> 01 低位
00
00
7F 高位
sin_port:
5120(0x1400)在內存中的佈局是
00 低位
14 高位
經過htons處理後
14 低位
00 高位
個人理解:重要的是標準
其實這個轉換要解決的問題是網絡上各個主機中數據類型的兼容問題。
假設有兩個主機A和B,A主機採用了LE字節序,B主機採用了BE字節序,
那麼整數0x12345678在A主機中的表示是
低位--------->高位
0x 78 56 34 12
如果不進行字節序變換A將這個數發給B主機時,B主機收到後在的數保存了內存佈局,
將這個數解釋爲 0x78563412 就會出現錯誤
來源:http://blog.csdn.net/icedmilk/article/details/5336296