Java 字节序

241 阅读2分钟

Java 字节序

  • Byte Order 字节序,也称为 Endianness 端序,分为大端序和小端序,指的是在计算机中多字节数据(大于一个字节的数据)在内存中的存储顺序,当进行跨平台数据传输和处理时候,需要注意两边的字节序差异,并进行相应的转换以确保程序的正确性
  • 大端字节序通常被视为网络通信的标准字节序,在不同计算机系统之间进行网络数据传输时,通常会先把数据转换为大端字节序以确保一致性
  • 大端字节序中的大指的是最高位字节(即最重要的字节,对数值影响最大的字节,就像书写十进制数时先写最高位数字一样)在内存中的位置是靠前端(低地址端)的
  • Java 中定义了 java.nio.ByteOrder#BIG_ENDIAN 和 java.nio.ByteOrder#LITTLE_ENDIAN 常量

Big-Endian 大端字节序

  • 数据的高位字节存储在内存的低地址端,低位字节存储在内存的高地址端
  • 比如 32 位 int 值 0x12345678,占 4 个字节,内存地址是从低地址到高地址排列,所以从高位到低位的字节序依次是 0x12、0x34、0x56 和 0x78,更直观,符合阅读和书写习惯,也称为人类字节序

Little-Endian 小端字节序

  • 数据的低位字节存储在内存的低地址端,高位字节存储在内存的高地址端
  • 比如 32 位 int 值 0x12345678,占 4 个字节,内存地址是从低地址到高地址排列,那么从低位到高位的字节序依次是 0x78、0x56、0x34 和 0x12,更符合计算机读取内存的方式(因为 CPU 读取内存中的数据是从低地址向高地址方向进行读取的)

Network Byte Order 网络字节序

  • TCP/IP 协议中使用的网络字节序通常都采用的是大端字节序,所以通常称之为网络字节序,为了确保在不同计算机 CPU 架构之间进行数据网络传输交换时的一致性

Host Byte Order 主机字节序

  • 计算机主机内存中使用的字节序,可能是大端序也可能是小端序,主要由该计算机的 CPU 架构来决定的,常用的主机字节序一般是小端字节序,比如 x86、x86_64、x64 和 amd64 都是小端序,而 arm 默认是小端序,不过支持通过设置特定的系统寄存器来切换为大端序