大端字节序 和 小端字节序

  • 大端字节序:高位字节在前,低位字节在后,这是人类读写数值的方法。
  • 小端字节序:低位字节在前,高位字节在后。

为啥有大小端问题?

计算机系统中,是以字节为单位的,每个地址单元对应着一个字节(8bit)。但是现代语言除了8bit的char之外,还有16bit的short,32bit的long等,这样的问题就是如何将多个字节安排到存储单元中了。

大小端的应用场景

  1. 不同端模式的处理器进行数据传递时必须要考虑端模式的不同
  2. 在网络上传输数据时,由于数据传输的两端对应不同的硬件平台,采用的存储字节顺序可能不一致。所以在TCP/IP协议规定了在网络上必须采用网络字节顺序,也就是大端模式。

对于char型数据只占一个字节,无所谓大端和小端。而对于非char类型数据,必须在数据发送到网络上之前将其转换成大端模式。接收网络数据时按符合接受主机的环境接收。

如何判断是大端还是小端?

public static void main(String[] args) {
    if (ByteOrder.nativeOrder() == ByteOrder.BIG_ENDIAN) {
        System.out.println("BIG_ENDIAN");
    } else {
        System.out.println("LITTLE_ENDIAN");
    }
}

常见的字节序

一般操作系统都是小端,Java和所有的网络通讯协议都是使用Big-Endian的编码。

Big Endian : PowerPC、IBM、Sun Little Endian : x86、DEC

GIF – Little Endian JPEG – Big Endian

如何读取?

/* 大端字节序 */
i = (data[3]<<0) | (data[2]<<8) | (data[1]<<16) | (data[0]<<24);

/* 小端字节序 */
i = (data[0]<<0) | (data[1]<<8) | (data[2]<<16) | (data[3]<<24);

results matching ""

    No results matching ""