Java中如何判斷當前環境是大端字節順序還是小端字節順序


Java非字節類型的基本類型,除了布爾型都是由組合在一起的幾個字節組成的。這些數據類 型及其大小總結在表 2-1 中。

表:基本數據類型及其大小

數據類型

大小(以字節表示)

Byte

1

Char

2

Short

2

Int

4

Long

8

Float

4

Double

8

每個基本數據類型都是以連續字節序列的形式存儲在內存中。例如,32 位的 int 值 0x037fb4c7(十進制的 58,700,999),如果是大端字節順序則如左圖所顯示的那樣被塞入內存字節中 (內存地址從左往右增加)。如果是小端字節順序,則低位(例如03)放在字節的小端,如下面的兩個圖。

 
左圖:大端字節順序                      右圖:小端字節順序
 

多字節數值被存儲在內存中的方式一般被稱為 endian-ness(字節順序)。如果數字數 值的最高字節——big end(大端),位於低位地址,那么系統就是大端字節順序(如左圖所示)。如果最低字節最先保存在內存中,那么就是小端字節順序(如右圖所示)。記憶方法就是看誰先放於低位地址,如果是高位字節就是大端;如果是 低位字節就是小端。

字節順序很少由軟件設計者決定;它通常取決於硬件設計。字節順序的兩種類型有時被稱 為字節性別,在當今被廣泛使用。兩種方式都具有自身的優勢。Intel 處理器使用小端字節 順序涉及。摩托羅拉的 CPU 系列、SUN 的 Sparc 工作站,以及 PowerPC 的 CPU 架構都采用 大端字節順序。 

 

那么Java中如何確定一個當前環境所用的CPU是何種類型的字節順序呢。我在java.nio.Bits中看見一段代碼是這樣實現的,很有意思。

static {
    long a = unsafe.allocateMemory(8);
    try {
        unsafe.putLong(a, 0x0102030405060708L);
        byte b = unsafe.getByte(a);
        switch (b) {
        case 0x01: byteOrder = ByteOrder.BIG_ENDIAN;     break;
        case 0x08: byteOrder = ByteOrder.LITTLE_ENDIAN;  break;
        default:
            assert false;
            byteOrder = null;
        }
    } finally {
        unsafe.freeMemory(a);
    }
}

 

原理很簡單,就是先分配8個字節Long類型的內存,然后放內存中放入16進制0x0102030405060708L的數據,判斷第一個字節是0x01還是0x08,如果是0x01,則說明大端字節順序,如果是最大的0x08,則是小端字節順序。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM