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