ByteOrder直译的意思就是字节序。
在计算机网络二进制传输的过程中,字节存在两种序列化顺序:高位字节序和低位字节序。
高位字节序:高位字节在前,低位字节在后(内存地址低位在前,高位地址在后)。低位字节序:低位字节在前,高位字节在后(内存地址低位在前,高位地址在后)。
netty中默认字节序是大端字节序,即字节高位在前,低位在后,符合人类的书写习惯。
ByteOrder类也比较简单,只存在返回高位还是低位的ByteOrder和描述ByteOrder的name字段。
public final class ByteOrder {
private String name;
private ByteOrder(String name) {
this.name = name;
}
/**
* Constant denoting big-endian byte order. In this order, the bytes of a
* multibyte value are ordered from most significant to least significant.
*/
public static final ByteOrder BIG_ENDIAN
= new ByteOrder("BIG_ENDIAN");
/**
* Constant denoting little-endian byte order. In this order, the bytes of
* a multibyte value are ordered from least significant to most
* significant.
*/
public static final ByteOrder LITTLE_ENDIAN
= new ByteOrder("LITTLE_ENDIAN");
/**
* 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();
}
/**
* Constructs a string describing this object.
*
* <p> This method returns the string <tt>"BIG_ENDIAN"</tt> for {@link
* #BIG_ENDIAN} and <tt>"LITTLE_ENDIAN"</tt> for {@link #LITTLE_ENDIAN}.
* </p>
*
* @return The specified string
*/
public String toString() {
return name;
}
}
netty测试:
①、默认使用高位存储字节序。
public class ByteOrder {
private static final int writeInt = 345;
public static void main(String[] args) {
ByteBuf byteBuf = Unpooled.buffer(4,4);
byteBuf.writeIntLE(writeInt);
byte[] arr = new byte[4];
byteBuf.readBytes(arr);
System.out.println(Arrays.toString(arr));
}
}
②、使用小端字节序。