将int转换为byte时的BufferOverflowException

时间:2015-09-17 09:10:16

标签: java arrays byte bytebuffer

我的counter从0到32767

在每一步,我想将counter(int)转换为2字节数组。

我试过这个,但我得到了BufferOverflowException例外:

byte[] bytearray = ByteBuffer.allocate(2).putInt(counter).array();

3 个答案:

答案 0 :(得分:2)

是的,这是因为int在缓冲区中占用4个字节,无论其值如何。

ByteBuffer.putInt对此和例外情况都很清楚:

  

以当前字节顺序将包含给定int值的四个字节写入当前位置的此缓冲区,然后将位置递增4。

     

...

     

<强>抛出:
  BufferOverflowException - 如果此缓冲区中剩余的字节少于四个

要写两个字节,请使用putShort代替...并理想地将counter变量更改为short,以明确预期范围是什么

答案 1 :(得分:1)

首先,您似乎假设int是大端。嗯,这是Java所以肯定会是这样。

其次,您的错误是预期的:int是4个字节。

由于您需要最后两个字节,因此无需通过字节缓冲区即可完成此操作:

public static byte[] toBytes(final int counter)
{
    final byte[] ret = new byte[2];
    ret[0] = (byte) ((counter & 0xff00) >> 8);
    ret[1] = (byte) (counter & 0xff);
    return ret;
}

您当然可以使用ByteBuffer

public static byte[] toBytes(final int counter)
{
    // Integer.BYTES is there since Java 8
    final ByteBuffer buf = ByteBuffer.allocate(Integer.BYTES);
    buf.put(counter);
    final byte[] ret = new byte[2];
    // Skip the first two bytes, then put into the array
    buf.position(2);
    buf.put(ret);
    return ret;
}

答案 2 :(得分:0)

这应该有效

写入包含给定short值的两个字节  当前字节顺序,进入当前位置的缓冲区,然后  将位置增加2。

byte[] bytearray = ByteBuffer.allocate(2).putShort((short)counter).array();