我试图将 int
转换为 byte[]
, 并写了以下代码:
byte[] bytes = new byte[4];
ByteBuffer buff = ByteBuffer.allocate(4);
buff.putInt(1222);
buff.get(bytes);
但是结果是我得到了java.nio.BufferOverflowException异常,但没有详细的信息。
对于我来说,代码是有效的。问题出在哪里?如何将int
转换为byte[]
?
我试图将 int
转换为 byte[]
, 并写了以下代码:
byte[] bytes = new byte[4];
ByteBuffer buff = ByteBuffer.allocate(4);
buff.putInt(1222);
buff.get(bytes);
但是结果是我得到了java.nio.BufferOverflowException异常,但没有详细的信息。
对于我来说,代码是有效的。问题出在哪里?如何将int
转换为byte[]
?
在将数据放入缓冲区后,您忘记了调用flip()
方法。
将int
放入缓冲区后,位置位于缓冲区末尾。尝试读取数据会导致BufferUnderflowException
异常(而不是溢出),因为缓冲区中没有剩余的字节可读取。
byte[] bytes = new byte[4];
ByteBuffer.wrap(bytes).putInt(0x12345678);
System.out.println(Arrays.toString(bytes));
[18, 52, 86, 120]
这是0x12、0x34、0x56和0x78。
public static byte[] intToByteArray(int value) {
if ((value >>> 24) > 0) {
return new byte[]{
(byte) (value >>> 24),
(byte) (value >>> 16),
(byte) (value >>> 8),
(byte) value
};
} else if ((value >> 16) > 0) {
return new byte[]{
(byte) (value >>> 16),
(byte) (value >>> 8),
(byte) value
};
} else if ((value >> 8) > 0) {
return new byte[]{
(byte) (value >>> 8),
(byte) value
};
} else {
return new byte[]{
(byte) value
};
}
}
与您自己的解决方案类似,但更加简洁,结果直接在字节数组中。
byte[] bytes = new byte[4];
// BigEndian
ByteBuffer.wrap(bytes).putInt(1222);
// LittleEndian
ByteBuffer.wrap(bytes).order(LITTLE_ENDIAN).putInt(1222);