網絡字節序: MSB 高字節前存法 Most Significant Bit (Big Edian)
主機字節序: LSB 低字節前存法 Lest Significant Bit (Little Edian)
因為現行的計算機都是以八位一個字節為存儲單位,那么一個16位的整數,也就是C語言中的short,在內存中可能有兩種存儲順序big-endian和litte-endian。考慮一個short整數0x3132(0x32是低位,0x31是高位),把它賦值給一個short變量,那么它在內存中的存儲可能有如下兩種情況:





可以做個實驗
在Windows上下如下程序
#include <stdio.h>
#include <assert.h>

int main(void)


{
short test;
FILE* fp;

test = 0x3132; /**//* (31ASIIC碼的'1', 32ASIIC碼的'2') */
if ((fp = fopen("c:\\test.txt", "wb")) == NULL)
assert(0);
fwrite(&test, sizeof(short), 1, fp);
fclose(fp);
return 0;
}
然后在C盤下打開test.txt文件,可以看見內容是21,而test等于0x3132,可以明顯的看出來x86的字節順序是低位在前。如果我們把這段同樣的代碼放到(big-endian)的機器上執行,那么打出來的文件就是12。這在本機中使用是沒有問題的。但當你把這個文件從一個big-endian機器復制到一個little-endian機器上時就出現問題了。
如上述例子,我們在big-endian的機器上創建了這個test文件,把其復制到little-endian的機器上再用fread讀到一個short里面,我們得到的就不再是0x3132而是0x3231了,這樣讀到的數據就是錯誤的,所以在兩個字節順序不一樣的機器上傳輸數據時需要特別小心字節順序,理解了字節順序在可以幫助我們寫出移植行更高的代碼。


正因為有字節順序的差別,所以在網絡傳輸的時候定義了所有字節順序相關的數據都使用big-endian,BSD的代碼中定義了四個宏來理:
#define ntohs(n) //網絡字節順序到主機字節順序 n代表net, h代表host, s代表short
#define htons(n) //主機字節順序到網絡字節順序 n代表net, h代表host, s代表short
#define ntohl(n) //網絡字節順序到主機字節順序 n代表net, h代表host, s代表long
#define htonl(n) //主機字節順序到網絡字節順序 n代表net, h代表host, s代表long