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