我的counter
从0到32767
在每一步,我想将counter
(int)转换为2字节数组。
我试过这个,但我得到了BufferOverflowException
例外:
byte[] bytearray = ByteBuffer.allocate(2).putInt(counter).array();
答案 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();