java -- Big Endian and Little Endian 大端和小端概念讲解及如何转换
什么是大端、小端?
字節(jié)是計(jì)算機(jī)中數(shù)據(jù)處理的基本單位。
計(jì)算機(jī)中以字節(jié)為單位存儲(chǔ)和解釋信息,規(guī)定一個(gè)字節(jié)由八個(gè)二進(jìn)制位構(gòu)成,即1個(gè)字節(jié)等于8個(gè)比特(1Byte=8bit)。
計(jì)算機(jī)進(jìn)行數(shù)據(jù)處理時(shí),一次存取、加工和傳送的數(shù)據(jù)長(zhǎng)度稱(chēng)為字(word)。一個(gè)字通常由一個(gè)或多個(gè)(一般是字節(jié)的整數(shù)位)字節(jié)構(gòu)成。
但并非所有計(jì)算機(jī)都以相同的順序存儲(chǔ)由多字節(jié)值組成的字節(jié)。考慮一個(gè)由2個(gè)字節(jié)組成的16位因特網(wǎng)。存儲(chǔ)該值有兩種方式
- Little Endian 小端: 低階字節(jié)存儲(chǔ)在起始地址(A),高階字節(jié)存儲(chǔ)在下一個(gè)地址(A + 1)
- Big Endian 大端:高階字節(jié)存儲(chǔ)在起始地址(A),低階字節(jié)存儲(chǔ)在下一個(gè)地址(A + 1)
網(wǎng)絡(luò)字節(jié)順序: 為了允許具有不同字節(jié)順序約定的計(jì)算機(jī)相互通信,Internet協(xié)議為在網(wǎng)絡(luò)上傳輸?shù)臄?shù)據(jù)指定了規(guī)范的字節(jié)順序約定。
network order 即網(wǎng)絡(luò)序,默認(rèn)網(wǎng)絡(luò)傳輸字節(jié)為大端
小端和大端是存儲(chǔ)多字節(jié)數(shù)據(jù)類(lèi)型(int、float等)的兩種方式
- 計(jì)算機(jī)內(nèi)存由正整數(shù)地址引用。在計(jì)算機(jī)內(nèi)存中,把最低有效字節(jié)放在最高有效字節(jié)之前存儲(chǔ)數(shù)字是“自然的”。
“自然”順序,即在內(nèi)存中較低有效字節(jié)出現(xiàn)在較高有效字節(jié)之前。自然順序是采用小端方式存儲(chǔ)- 基于英特爾的處理器是小端。ARM處理器是小端處理器。
- 但許多供應(yīng)商,如IBM、CRAY和Sun,更喜歡采用相反的順序存儲(chǔ)數(shù)據(jù),即采用大端方式存儲(chǔ)。
- 雙端處理器可以在小端和大端兩種模式下運(yùn)行。當(dāng)前的一代ARM處理器是雙端處理器。
根據(jù)這些定義,一種32位數(shù)據(jù)模式,它被視為32位無(wú)符號(hào)整數(shù)。“高階”字節(jié)是2的最大次方:231,…, 224。“低階”字節(jié)是2的最小次方: 27,…, 20。
示例如下:
- MSB:全稱(chēng)為Most Significant Bit,在二進(jìn)制數(shù)中屬于最高有效位,MSB是最高加權(quán)位,與十進(jìn)制數(shù)字中最左邊的一位類(lèi)似。
- LSB:全稱(chēng)為L(zhǎng)east Significant Bit,在二進(jìn)制數(shù)中意為最低有效位,
一般來(lái)說(shuō),MSB位于二進(jìn)制數(shù)的最左側(cè),LSB位于二進(jìn)制數(shù)的最右側(cè)。
字節(jié)順序是否影響文件格式?
- 以1字節(jié)為基本單位的文件格式獨(dú)立于字節(jié)順序,例如ASCII文件。
- 其他文件格式使用一些固定的端順序格式,例如JPEG文件以大端順序格式存儲(chǔ)。
- java 全部為大端(與平臺(tái)無(wú)關(guān)): Java二進(jìn)制文件中的所有內(nèi)容都以大端順序存儲(chǔ)。這意味著如果您只使用Java,那么所有文件在所有平臺(tái)(Mac、PC、UNIX等)上的處理方式都是相同的。
- C語(yǔ)言默認(rèn)是小端模式:用C語(yǔ)言編寫(xiě)的程序通常使用 小端順序
如何知道機(jī)器的字節(jié)次序
How to Know the Endian-ness?
在Java中,我們可以使用ByteOrder.nativeOrder()方法來(lái)獲取CPU使用的字節(jié)順序。在使用Intel CPU 或 AMD CPU時(shí),輸出結(jié)果都是小端順序
如何進(jìn)行大小端的轉(zhuǎn)換
在java中,可以基于ByteBuffer提供的order方法,進(jìn)行大小端的轉(zhuǎn)換
如處理網(wǎng)絡(luò)字節(jié)流時(shí),先針對(duì)獲取的byte[] 進(jìn)行 buffer.order(ByteOrder.BIG_ENDIAN);
總結(jié)
以上是生活随笔為你收集整理的java -- Big Endian and Little Endian 大端和小端概念讲解及如何转换的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 实例:用C#.NET手把手教你做微信公众
- 下一篇: CDN详解