用于大端的字节缓冲区中的字节排序

时间:2014-06-03 21:47:39

标签: java endianness bytebuffer

我知道小端和大端在网上被解释过,但我仍然感到困惑。

如果您有一个设置为使用big endian的字节缓冲区。你有:

short value = 4660; // corresponds to 0x1234

当你这样做时:

bb.putShort( 16, value );

字节0x12是否位于索引16处,而0x34位于索引17处。或者,0x34位于索引16处,0x34位于索引17处?我对在线描述感到困惑。

谢谢!

2 个答案:

答案 0 :(得分:3)

0x12345678为例。

查看它的一种方法:

Endianess | Least Significant Byte | Most Significant Byte  | In Memory
----------|------------------------|------------------------|-----------
Big       | In The Highest Address | In The Lowest  Address | 0x12345678
----------|------------------------|------------------------|-----------
Little    | In The Lowest  Address | In The Highest Address | 0x78563412

另一种观察方式:

Endianess | In The Lowest Address  | In The Highest Address | In Memory
----------|------------------------|------------------------|-----------
Big       | Most Significant Byte  | Least Significant Byte | 0x12345678
----------|------------------------|------------------------|-----------
Little    | Least Significant Byte | Most Significant Byte  | 0x78563412

如果你正在寻找一种记忆方法,那么请注意每种方法都有自己的意义:

  • Big-Endian,因为它类似于我们编写数字的方式(从最高位开始)
  • Little-Endian,因为最低有效字节存储在最低地址

答案 1 :(得分:2)

您可以通过编写6(!)行代码来解决这个问题。

ByteBuffer allocate = ByteBuffer.allocate(2);
allocate.order(ByteOrder.BIG_ENDIAN);
allocate.putShort((short) 0x1234);
allocate.rewind();
System.out.println(Integer.toHexString(allocate.get()));
System.out.println(Integer.toHexString(allocate.get()));

提示:" Big End" -ian在最后一个地址有最后一个字节。因此,内存正是您将其视为0x12 0x34的方式。