轉自:http://blog.chinaunix.net/u/29331/showart_356837.html
big-endian和little-endian這兩個術語來自Jonathan Swift在十八世紀的嘲諷作品Gulliver’s Travels。 Blefuscu帝國的國民被根據吃雞蛋的方式劃分爲兩個部分:一部分在吃雞蛋的時候從雞蛋的大端(big end)開始,而另一部分則從雞蛋的小端(little end)開始。
x86的CPU使用的是LE(Windows中稱爲“主機字節序”),而SocksAddr中使用的則是BE(就是“網絡字節序”),所以在使用網絡編程時需要使用htns,htnl,nths,nthl來倒字節序。
其實對彙編熟了就清楚了,慘,我的彙編很慘的
LE little-endian
最符合人的思維的字節序
地址低位存儲值的低位
地址高位存儲值的高位
怎麼講是最符合人的思維的字節序,是因爲從人的第一觀感來說
低位值小,就應該放在內存地址小的地方,也即內存地址低位
反之,高位值就應該放在內存地址大的地方,也即內存地址高位
BE big-endian
最直觀的字節序
地址低位存儲值的高位
地址高位存儲值的低位
爲什麼說直觀,不要考慮對應關係
只需要把內存地址從左到右按照由低到高的順序寫出
把值按照通常的高位到低位的順序寫出
兩者對照,一個字節一個字節的填充進去
例子:在內存中雙字0x01020304(DWORD)的存儲方式
內存地址
4000 4001 4002 4003
LE 04 03 02 01
BE 01 02 03 04
MSDN中關於LE和BE的解釋
Byte Ordering Byte ordering Meaning
big-endian The most significant byte is on the left end of a word.
little-endian The most significant byte is on the right end of a word.
這裏這個最重要的字節可以解釋成值的最高位,如果換成是錢的話就是最值錢的那一位
比如我有1234元人民幣,最值錢的是1000元,最不值錢的是4元,那麼這個1就是最重要的字節
Big endian machine: It thinks the first byte it reads is the biggest.
Little endian machine: It thinks the first byte it reads is the littlest.
舉個例子,從內存地址0x0000開始有以下數據
0x0000 0x12
0x0001 0x34
0x0002 0xab
0x0003 0xcd
如果我們去讀取一個地址爲0x0000的四個字節變量,若字節序爲big-endian,則讀出
結果爲0x1234abcd;若字節序位little-endian,則讀出結果爲0xcdab3412.
如果我們將0x1234abcd寫入到以0x0000開始的內存中,則結果爲
big-endian little-endian
0x0000 0x12 0xcd
0x0001 0x23 0xab
0x0002 0xab 0x34
0x0003 0xcd 0x12
x86系列CPU都是little-endian的字節序.