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