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