将 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();
我有一个从 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();