【问题标题】:Java ByteBuffer.wrap(byte[]), what happens to endianness if byte[] is ordered in little endianJava ByteBuffer.wrap(byte[]),如果 byte[] 以小端序排列,字节序会发生什么变化
【发布时间】:2020-01-17 12:10:54
【问题描述】:

我试图理解ByteBuffer.wrap(byte[]) 甚至ByteBuffer 的一般含义:

如果我有一个字节数组,其中包含一些不同长度和不同类型的值(例如int16s、int32s、UTF-16 字符串,所有这些都是 LITTLE ENDIAN 字节顺序和一些 ASCII 字符串)然后用ByteBuffer 包装它并通过网络发送,比如说通过AsynchronousSocketChannel,那么我的字节按什么顺序发送?

它是否以 BIG ENDIAN 格式发送它们?它是将字节数组视为一个大数据并将其顺序更改为大端还是它感知字节顺序并仅添加具有大端字节顺序的新元素?

背景是我正在处理一个以小端顺序发送和接收字节的客户端,它似乎无法处理我通过网络发送的数据。

【问题讨论】:

  • 数据保持原样。
  • 获取/放置多字节值(例如putIntgetLong等)时,字节顺序很重要。

标签: java networking byte buffer


【解决方案1】:

如果数据在包装的缓冲区中是小端的,那么它会保持小端的顺序。如果添加整数值,则取决于缓冲区的顺序,默认为大端或“网络顺序”。

缓冲区instance 的字节顺序仅在使用各种getset 方法(例如getIntputInt(使用或没有位置)。如果字节顺序改变,缓冲区和已经存储的数据保持不变。

基本上,当从缓冲区检索数据时,首先检索(并发送)索引最低的字节,然后是下一个,等等。通常认为是最左边的字节。换句话说,当从缓冲区检索字节并发送时,位置总是上升,直到达到限制。

【讨论】:

  • 基本上第0个字节是先发送的,然后是第1个、第2个等。endiannss与它无关。这是一个字节数组。
  • @user207421 我正要写这个,但位置可能并不总是为零,但对于刚刚包装的字节数组来说确实如此。
  • 感谢您的回答!因此,这意味着 ByteOrder 仅指定在调用 getInt 或 getFloat 等方法时如何解释底层 Byte 数组中的数据。另一方面,它指定了当我使用 putInt 或 putFloat 等方法时如何添加数据,对吗?
  • 是的,就是这样,它包括 putChar 尽管你应该使用编码器来代替。
猜你喜欢
  • 2017-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-23
  • 2010-10-30
相关资源
最近更新 更多