1、定义
字节顺序,又称端序或尾序(英语:Endianness),在计算机科学领域中,指电脑内存中或在数字通信链路中,组成多字节的字的字节的排列顺序。
在几乎所有的机器上,多字节对象都被存储为连续的字节序列。
2、表现形式
字节的排列方式有两个通用规则。例如,将一个多位数的低位放在较小的地址处,高位放在较大的地址处,则称小端序(Little-endian);反之则称大端序(Big-endian)。
在网络应用中,字节序是一个必须被考虑的因素,因为不同机器类型可能采用不同标准的字节序,所以均按照网络标准转化。
例如假设变量x类型为int,位于地址0xa处,它的值为0x0A0B0C0D,地址范围为0xa~0xa+3字节,其内部排列顺序依赖于机器的类型。(注: 0x前缀代表十六进制。)
2.1、小端序是:0xa: 0x0D, 0xa+1: 0x0C, ......
image
2.2、大端序是:0xa: 0x0A, 0xa+1: 0x0B, ......
image
2.3、混合序(middle-endian)具有更复杂的顺序。以PDP-11为例,0x0A0B0C0D被存储为:
image
混合序可以看作高16bit和低16bit以大端序存储,但16bit内部以小端存储。
3、其他
网络传输一般采用大端序,也被称之为网络字节序,或网络序。IP协议中定义大端序为网络字节序。
其他的,还有处理器的大小端序,串行设备传输的大小端序等等,有兴趣的可以另外继续研究。
4、字节顺序在Java的应用
public class Demo1 {
public static void main(String[] args) {
int x = 0x01020304;
ByteBuffer bb = ByteBuffer.wrap(new byte[4]);
bb.asIntBuffer().put(x);
String ss_before = Arrays.toString(bb.array());
System.out.println("默认字节序 " + bb.order().toString() + "," + " 内存数据 " + ss_before);
bb.order(ByteOrder.LITTLE_ENDIAN);
bb.asIntBuffer().put(x);
String ss_after = Arrays.toString(bb.array());
System.out.println("修改字节序 " + bb.order().toString() + "," + " 内存数据 " + ss_after);
}
}
运行结果:
默认字节序 BIG_ENDIAN, 内存数据 [1, 2, 3, 4]
修改字节序 LITTLE_ENDIAN, 内存数据 [4, 3, 2, 1]
所以Java 的默认字节序是大端序