1.故事的起源
“endian”這個詞出自《格列佛游記》。小人國的內(nèi)戰(zhàn)就源于吃雞蛋時是究竟從大頭(Big-Endian)敲開還是從小頭(Little-Endian)敲開,由此曾發(fā)生過六次叛亂,其中一個皇帝送了命,另一個丟了王位。
我們一般將endian翻譯成“字節(jié)序”,將big endian和little endian稱作“大尾”和“小尾”。
2.什么是Big Endian和Little Endian?
在設(shè)計計算機系統(tǒng)的時候,有兩種處理內(nèi)存中數(shù)據(jù)的方法。一種叫為little-endian,存放在內(nèi)存中最低位的數(shù)值是來自數(shù)據(jù)的最右邊部分(也就是數(shù)據(jù)的最低位部分)。比如一個16進制數(shù)字0x12345678, 在內(nèi)存存放的方式如下:
值 | 0111,1000 | 0101,0110 | 0011,0100 | 0001,0010 |
地址 | 100 | 101 | 102 | 103 |
另一種稱為big-endian,正好相反,存放在內(nèi)存中最低位的數(shù)值是來自數(shù)據(jù)的最左邊邊部分(也就是數(shù)據(jù)的最高為部分)。比如一個16進制數(shù)字0x12345678, 在內(nèi)存存放的方式如下:
值 | 0001,0010 | 0011,0100 | 0101,0110 | 0111,1000 |
地址 | 100 | 101 | 102 | 103 |
比如某些文件需要在不同平臺處理,或者通過Socket通信。這方面我們可以借助ntohl(), ntohs(), htonl(), and htons()函數(shù)進行格式轉(zhuǎn)換。
3.如何判斷系統(tǒng)是Big Endian還是Little Endian?
在/usr/include/中(包括子目錄)查找字符串BYTE_ORDER(或_BYTE_ORDER, __BYTE_ORDER),確定其值。這個值一般在endian.h或machine/endian.h文件中可以找到,有時在feature.h中,不同的操作系統(tǒng)可能有所不同。一般來說,Little Endian系統(tǒng)BYTE_ORDER(或_BYTE_ORDER,__BYTE_ORDER)為1234,Big Endian系統(tǒng)為4321。大部分用戶的操作系統(tǒng)(如windows, FreeBsd,Linux)是Little Endian的。少部分,如MAC OS ,是Big Endian 的。本質(zhì)上說,Little Endian還是Big Endian與操作系統(tǒng)和芯片類型都有關(guān)系。