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