将int转换为byte时发生BufferOverflowException异常

4

我有一个计数器,从0计数到32767。

每一步,我想将计数器(int)转换为一个2字节数组。

我尝试过这个方法,但是我得到了一个BufferOverflowException异常:

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

你期望什么呢?你试图将4个字节放入一个长度为2个字节的缓冲区中。 - fge
你想要实现什么目标? - akash
将最大数字更改为32767。如果我通过移位来做到这一点,值128将变为-128。但我需要正字节。 - Struct
3个回答

4
是的,这是因为一个int在缓冲区中占用4个字节,无论其值如何。 ByteBuffer.putInt清楚地说明了这一点和异常:
写入包含给定int值的四个字节,在当前字节顺序下,将该值存储到当前位置的此缓冲区中,然后将该位置增加四个字节。 ... 抛出: BufferOverflowException - 如果此缓冲区中剩余的字节数少于四个
要写入两个字节,请改用putShort...并最好将您的counter变量也更改为short,以明确预期的范围。

它的工作原理是使用短整型,但如果计数器达到128,转换后的字节将变为-128而不是128。 - Struct
@Struct:它将是适当的位集合 - 只是 Java 中的 byte 是(不幸地)有符号的。不存在 byte 值为 128。无论如何将两个字节的值转换回 short,都会得到正确的值。 - Jon Skeet

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;
}

ByteBuffer示例中似乎有2个拼写错误: buf.put(counter) -> buf.putInt(counter); buf.put(ret) -> buf.get(ret); - Mykhail Martsyniuk

0

这应该可以工作

以当前字节顺序写入包含给定短整型值的两个字节到此缓冲区的当前位置,然后将位置增加两个。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接