大端字节序 和 小端字节序
- 大端字节序:高位字节在前,低位字节在后,这是人类读写数值的方法。
- 小端字节序:低位字节在前,高位字节在后。
为啥有大小端问题?
计算机系统中,是以字节为单位的,每个地址单元对应着一个字节(8bit)。但是现代语言除了8bit的char之外,还有16bit的short,32bit的long等,这样的问题就是如何将多个字节安排到存储单元中了。
大小端的应用场景
- 不同端模式的处理器进行数据传递时必须要考虑端模式的不同
- 在网络上传输数据时,由于数据传输的两端对应不同的硬件平台,采用的存储字节顺序可能不一致。所以在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);