将 int 转换为 byte 时出现 BufferOverflowException

BufferOverflowException while converting int to byte

我有一个从 0 到 32767 的 counter

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

我试过了,但是我得到了一个 BufferOverflowException 异常:

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

首先,您似乎假设 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;
}

是的,这是因为 int 在缓冲区中占用 4 个字节,与值无关。

ByteBuffer.putInt 清楚这一点和异常:

Writes four bytes containing the given int value, in the current byte order, into this buffer at the current position, and then increments the position by four.

...

Throws:
BufferOverflowException - If there are fewer than four bytes remaining in this buffer

要写入两个字节,请改用 putShort...并且最好将 counter 变量也更改为 short,以明确预期的范围成为。

这应该有效

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

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