大小端存储顺序与ByteOrder

想起之前阿里面试的时候有个面试官问道一个问题,怎么通过编码的方式获取当前机器是大端存储还是小端存储,当时问的我一脸懵逼,大小端还是在学计算机组成的时候接触到的概念,今天在看NIO的时候,突然又碰到了,而且居然提到了可以通过java.nio包中ByteOrder这个类文件来直接获取当前JVM运行的机器存储的固有字节顺序。

大小端

多字节数值被存储在内存中的方式一般被称为字节顺序。
如果数字数值的最高字节,位于内存的低位位置,那么系统就是大端字节顺序。
否则,如果数字数值的最低字节,位于内存的低位位置,那么系统就是小端字节顺序。
例如:32位的int值0x037fb4c7(十进制的58700999),下面内存地址从左到有增加,即左边地位地址右边高位地址。

  • 大端字节顺序
    |03|7f|b4|c7|
  • 小端字节顺序
    |c7|b4|7f|03|

ByteOrder

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package java.nio;
public final class ByteOrder {
private String name;
private ByteOrder(String name) {
this.name = name;
}
public static final ByteOrder BIG_ENDIAN
= new ByteOrder("BIG_ENDIAN");
public static final ByteOrder LITTLE_ENDIAN
= new ByteOrder("LITTLE_ENDIAN");
/**
* 保留了源码文件中的英文:意思就是该方法返回JVM所运行的硬件平台的字节顺序。
* Retrieves the native byte order of the underlying platform.
*
* <p> This method is defined so that performance-sensitive Java code can
* allocate direct buffers with the same byte order as the hardware.
* Native code libraries are often more efficient when such buffers are
* used. </p>
*
* @return The native byte order of the hardware upon which this Java
* virtual machine is running
*/
public static ByteOrder nativeOrder() {
return Bits.byteOrder();
}
public String toString() {
return name;
}
}

如果你想知道自己的机器上的固有的字节存储顺序,就调用nativeOrder()方法就行了。代码如下:

1
2
3
4
5
6
7
8
public static void main(String[] args) {
System.out.println(ByteOrder.nativeOrder().toString());
}
执行结果如下:
================
LITTLE_ENDIAN
================

-EOF-