Big Endian 和 Little Endian 详解
一、Endian的起源
在各種計算機體系結構中,對于字節(jié)、字等的存儲機制有所不同,因而引發(fā)了計算機通信領域中一個很重要的問題,即通信雙方交流的信息單元(比特、字節(jié)、字、雙字等等)應該以什么樣的順序進行傳送。如果不達成一致的規(guī)則,通信雙方將無法進行正確的編/譯碼從而導致通信失敗。
1980年,Danny Cohen在其著名的論文”O(jiān)n Holy Wars and a Plea for Peace”中為了平息一場關于在消息中字節(jié)該以什么樣的順序進行傳送的爭論而引用了該詞。該文中,Cohen非常形象貼切地把支持從一個消息序列的最高位開始傳送的那伙人叫做Big-Endians,支持從最低位開始傳送的相對應地叫做Little-Endians。此后Endian這個詞便隨著這篇論文而被廣為采用。
二、字節(jié)序之Little-Endian&Big-Endian
首先,明確一點,咱們接觸到的物理單元最小都是字節(jié);因此,無論是big endian,還是little endian,都是針對多個字節(jié)的序列而言的;當然,在通信領域中,這里往往是bit,不過原理也是類似的,稍后我會介紹。
對于字節(jié)序列的存儲格式,目前有兩大陣營,那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列采用big endian方式存儲數(shù)據(jù),而x86系列則采用little endian方式存儲數(shù)據(jù)。那么究竟什么是big endian,什么又是little endian呢?
1)Little-endian:將低序字節(jié)存儲在起始地址(低位編址)
2)Big-endian:將高序字節(jié)存儲在起始地址(高位編址)
舉個例子:
如果我們將0x1234abcd寫入到以0x0000開始的內(nèi)存中,則結果為;
| 0x0000 | 0x12 | 0xcd |
| 0x0001 | 0x34 | 0xab |
| 0x0002 | 0xab | 0x34 |
| 0x0003 | 0xcd | 0x12 |
注:每個地址存1個字節(jié),2位16進制數(shù)是1個字節(jié)(0xFF=11111111);
為什么要注意字節(jié)序的問題呢?你可能這么問。當然,如果你寫的程序只在單機環(huán)境下面運行,并且不和別人的程序打交道,那么你完全可以忽略字節(jié)序的存在。
但是,如果你的程序要跟別人的程序產(chǎn)生交互呢?在這里我想說說兩種語言。C/C++語言編寫的程序里數(shù)據(jù)存儲順序是跟編譯平臺所在的CPU相關的,而JAVA編寫的程序則唯一采用big endian方式來存儲數(shù)據(jù)。
試想,如果你用C/C++語言在x86平臺下編寫的程序跟別人的JAVA程序互通時會產(chǎn)生什么結果?就拿上面的0x12345678來說,你的程序傳遞給別人的一個數(shù)據(jù),將指向0x12345678的指針傳給了JAVA程序,由于JAVA采取big endian方式存儲數(shù)據(jù),很自然的它會將你的數(shù)據(jù)翻譯為0x78563412。什么?竟然變成另外一個數(shù)字了?是的,就是這種后果。因此,在你的C程序傳給JAVA程序之前有必要進行字節(jié)序的轉換工作。
無獨有偶,所有網(wǎng)絡協(xié)議也都是采用big endian的方式來傳輸數(shù)據(jù)的。所以有時我們也會把big endian方式稱之為網(wǎng)絡字節(jié)序。當兩臺采用不同字節(jié)序的主機通信時,在發(fā)送數(shù)據(jù)之前都必須經(jīng)過字節(jié)序的轉換成為網(wǎng)絡字節(jié)序后再進行傳輸。
目前應該little endian是主流,因為在數(shù)據(jù)類型轉換的時候(尤其是指針轉換)不用考慮地址問題。
三、比特序之Little-Endian&Big-Endian
可是有朋友仍然會問,CPU存儲一個字節(jié)的數(shù)據(jù)時其字節(jié)內(nèi)的8個比特之間的順序是否也有big endian和little endian之分?或者說是否有比特序的不同?
實際上,這個比特序是同樣存在的。下面以數(shù)字0xB4(10110100)用圖加以說明。
MSB的意思是:全稱為Most Significant Bit,在二進制數(shù)中屬于最高有效位,MSB是最高加權位,與十進制數(shù)字中最左邊的一位類似。
LSB的意思是:全稱為Least Significant Bit,在二進制數(shù)中意為最低有效位,一般來說,MSB位于二進制數(shù)的最左側,LSB位于二進制數(shù)的最右側。
- Big Endian
- Little Endian
實際上,由于CPU存儲數(shù)據(jù)操作的最小單位是一個字節(jié),其內(nèi)部的比特序是什么樣對我們的程序來說是一個黑盒子。也就是說,你給我一個指向0xB4這個數(shù)的指針,對于big endian方式的CPU來說,它是從左往右依次讀取這個數(shù)的8個比特;而對于little endian方式的CPU來說,則正好相反,是從右往左依次讀取這個數(shù)的8個比特。而我們的程序通過這個指針訪問后得到的數(shù)就是0xB4,字節(jié)內(nèi)部的比特序對于程序來說是不可見的,其實這點對于單機上的字節(jié)序來說也是一樣的。
那可能有人又會問,如果是網(wǎng)絡傳輸呢?會不會出問題?是不是也要通過什么函數(shù)轉換一下比特序?嗯,這個問題提得很好。假設little endian方式的CPU要傳給big endian方式CPU一個字節(jié)的話,其本身在傳輸之前會在本地就讀出這個8比特的數(shù),然后再按照網(wǎng)絡字節(jié)序的順序來傳輸這8個比特,這樣的話到了接收端不會出現(xiàn)任何問題。而假如要傳輸一個32比特的數(shù)的話,由于這個數(shù)在littel endian方存儲時占了4個字節(jié),而網(wǎng)絡傳輸是以字節(jié)為單位進行的,little endian方的CPU讀出第一個字節(jié)后發(fā)送,實際上這個字節(jié)是原數(shù)的LSB,到了接收方反倒成了MSB從而發(fā)生混亂。
總結
以上是生活随笔為你收集整理的Big Endian 和 Little Endian 详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图像显著性检测——时域分析(谱残差法、相
- 下一篇: 深度学习入门之神经网络思维导图