什么是Little Endian和Big Endian?(Endianness:字节序、端序、尾序)
緬懷先驅(qū):提出字節(jié)序概念的以色列裔計算機科學(xué)家Danny Cohen1,于2019-08-22病逝,享年81歲2。
目錄
- 名詞釋義
- 概念由來
- 設(shè)計原理
- 應(yīng)用場景
- NBO(Net Bytes Order)
- HBO(Host Bytes Order)
名詞釋義
Endianness譯作字節(jié)順序,又稱端序、尾序、尾端序。目前主要在存儲或者網(wǎng)絡(luò)傳輸場景中,用于約定多字節(jié)數(shù)據(jù)的存儲或發(fā)送順序。
字節(jié)順序有兩種格式:
- LITTLE-ENDIAN:小字節(jié)序,又稱低字節(jié)序、小端序、小尾序、小尾端
可速記為:高位高存 - BIG-ENDIAN:大字節(jié)序,又稱高字節(jié)序、大端序、大尾序、大尾端
可速記為:高位低存
概念由來
計算機中數(shù)據(jù)都是按字節(jié)表達、每個字節(jié)固定8 bit。當(dāng)數(shù)據(jù)較長時,我們會用多個字節(jié)來表示數(shù)據(jù),如int數(shù)值需要4個字節(jié)。
多個字節(jié)要存儲或者網(wǎng)絡(luò)傳輸時,調(diào)用方/發(fā)送方和存儲器/接收方勢必要約定一個相同的順序,才能保證數(shù)據(jù)的含義能被對方正確理解。
比如0xb1b2b3b4這個16進制的int值,一共4個字節(jié)。如果發(fā)送時按照0xb1、0xb2、0xb3、0xb4的順序發(fā)送,而接收時認為發(fā)送方是按相反順序返送,則會任務(wù)接收到的數(shù)據(jù)是0xb4b3b2b1,這就出現(xiàn)理解不一致。
在早期的計算機體系結(jié)構(gòu)中,因為多字節(jié)存儲和傳輸順序并沒有統(tǒng)一規(guī)則,上面的場景經(jīng)常出現(xiàn),尤其是網(wǎng)絡(luò)通信非常困難。而對“網(wǎng)絡(luò)傳輸中哪種字節(jié)排序更合適”的爭論一時沸反盈天,已經(jīng)脫離技術(shù)本身的考慮,實際的情況卻遲遲得不到改善。
Danny Cohen認為:技術(shù)角度并不關(guān)心選擇哪種字節(jié)順序,重要的是行業(yè)需要統(tǒng)一的標(biāo)準(zhǔn)、大家堅持下去。于是在1980年由IETF發(fā)表的《論圣戰(zhàn)與和平訴求》(On Holy Wars and a Plea for Peace)一文中,他引用了《格列佛游記》中的典故,并使用類似文中概念的little-endian和big-endian,分別表示小端序和大端序。自此這個概念被廣泛采用。
Endianness詞根Endian出自Jonathan Swift的《格列佛游記》,原文如下:
“…我下面要告訴你的是,Lilliput和Blefuscu這兩大強國在過去的三十六個月里一直在苦戰(zhàn)。戰(zhàn)爭開始時由于一下原因:我們大家都認為,吃雞蛋前,原始的方法是打破雞蛋較大的一端(big-end),可是當(dāng)今皇帝的祖父小時候吃雞蛋,一次按古法打雞蛋時碰巧將一個手指弄破了,因此他的父親,當(dāng)時的皇帝,就下了一道赦令,命令全體臣民吃雞蛋是打破雞蛋較小的一端(little-end),違令者重罰。老百姓們對這項命令極為反感。歷史告訴我們,由此曾發(fā)生過六次叛亂,其中一個皇帝送了命,另一個丟了王位。這些判斷大多都是由Blefuscu的王國大臣們煽動起來的。叛亂平息后,流亡的人總是逃到那個帝國區(qū)尋求避難。據(jù)統(tǒng)計,先后幾次有一萬一千人情愿受死也不肯去打破雞蛋較小的一端。關(guān)于這一爭端,曾出版過幾百本大部著作,不過大端派(big-endians)的書一直是受禁的,法律也規(guī)定該派的任何人不得做官。"
雞蛋從哪頭打破,怎么會有哪種更合適呢?對個人生活和社會發(fā)展又有什么意義呢?Swift寫這段故事,其實是諷刺當(dāng)時法國和英國的時政,認為真正重要的事情得不到關(guān)注、而在一些毫無意義的事情上爭論不休。
這就是大端序和小端序的由來。下面介紹下兩種排序的具體原理。
設(shè)計原理
我們假設(shè)有一個int值0xb1b2b3b4(0x前綴代表16進制,共4個字節(jié)),要存入0x0000開頭的內(nèi)存地址(實際地址比這個要長,這里僅用作演示)。
那么兩種規(guī)則的存放方式對比如下:
| big-endian | 0xb1 | 0xb2 | 0xb3 | 0xb4 |
| little-endian | 0xb4 | 0xb3 | 0xb2 | 0xb1 |
上表體現(xiàn)了大端序和小端序的形式和區(qū)別,可以概括如下:
- big-endian:高位字節(jié)存儲在內(nèi)存低位,簡單理解為高(大)位字節(jié)(高位代表2的更大指數(shù),數(shù)值也更大)先出現(xiàn)。
- little-endian:高位字節(jié)存儲在內(nèi)存高位,簡單理解為低(小)位字節(jié)先出現(xiàn)。
應(yīng)用場景
NBO(Net Bytes Order)
網(wǎng)絡(luò)字節(jié)序,普遍理解為TCP/IP協(xié)議中使用的字節(jié)序。
Danny Cohen當(dāng)時確定的就是網(wǎng)絡(luò)層面的字節(jié)序規(guī)則,最終TCP/IP各層協(xié)議統(tǒng)一采用Big-Endian。
HBO(Host Bytes Order)
個人對處理器不甚了解,以下文字來自網(wǎng)絡(luò)。
在現(xiàn)代“馮.諾依曼體系結(jié)構(gòu)”的計算機中,數(shù)據(jù)都是采用二進制來存儲、以字節(jié)(Byte)為單位、每個字節(jié)包含8位二進制數(shù)字(8 bits)。
目前有兩大陣營,那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列采用Big-Endian方式存儲數(shù)據(jù),而x86系列則采用Little-Endian方式存儲數(shù)據(jù)。
大端和小端的形成有其歷史原因,我們在理解的基礎(chǔ)上,要明白發(fā)展才是硬道理。
得益于高級語言的發(fā)展,在現(xiàn)在的軟件開發(fā)基本不需關(guān)心字節(jié)序(除非是socket編程),如Java這類跨平臺移植的語言由虛擬機屏蔽了字節(jié)序問題。
JAVA虛擬機中多字節(jié)類型數(shù)據(jù)的存放順序,也就是JAVA字節(jié)序是Big-Endian。
可參考資料:
- https://www.cnblogs.com/Alandre/p/4878841.html
- https://www.cnblogs.com/thbCode/p/6018308.html
以上就是對little-endian和big-endian的全部介紹。
對內(nèi)存對齊有興趣的朋友,可參考下面文章:
- https://www.cnblogs.com/leezhm/archive/2011/07/19/2110864.html
- https://www.cnblogs.com/thbCode/p/6018308.html
待更新:
- 為什么一個字節(jié)定義為8 bit,定義長一些、足夠存儲最大的數(shù)據(jù)不就行了嗎?
- Java處理字節(jié)序的具體實現(xiàn)是怎么,如何將bit/byte輸出為最終數(shù)據(jù)?
- 開發(fā)中常見的數(shù)據(jù)檢索、內(nèi)存匹配等操作,是如何進行的、字節(jié)序如何運作?
https://en.wikipedia.org/wiki/Danny_Cohen_(computer_scientist) ??
https://www.oschina.net/news/109269/danny-cohen-has-died ??
總結(jié)
以上是生活随笔為你收集整理的什么是Little Endian和Big Endian?(Endianness:字节序、端序、尾序)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机毕业设计Java宁夏中卫城市风采在
- 下一篇: 团队-排课软件-最终程序