我需要将我的Integer值转换为字节数组。为了不在每次调用intToBytes方法时反复创建ByteBuffer,我定义了一个静态的ByteBuffer。
private static ByteBuffer intBuffer = ByteBuffer.allocate(Integer.SIZE / Byte.SIZE);
public static byte[] intToBytes(int Value)
{
intBuffer.order(ByteOrder.LITTLE_ENDIAN);
intBuffer.putInt(Value);
return intBuffer.array();
}
运行intToBytes方法时出现BufferOverflowException。
W / System.err:java.nio.BufferOverflowException W / System.err:at java.nio.ByteArrayBuffer.putInt(ByteArrayBuffer.java:352) W / System.err:在android.mobile.historian.Data.Convert.intToBytes(Convert.java:136)
在调试模式下,我看到intBuffer的容量是4,正如我对Integer值的预期。那么这里有什么问题?
答案 0 :(得分:2)
第二次运行时,您正在溢出全局缓冲区。
private static ByteBuffer intBuffer = ByteBuffer.allocate(Integer.SIZE / Byte.SIZE);
public static byte[] intToBytes(int Value)
{
intBuffer.clear(); //THIS IS IMPORTANT, YOU NEED TO RESET THE BUFFER
intBuffer.order(ByteOrder.LITTLE_ENDIAN);
intBuffer.putInt(Value);
return intBuffer.array();
}
ByteBuffer.putInt()的一些上下文: 将给定的int写入当前位置并将位置增加4。 使用当前字节顺序将int转换为字节。 抛出 BufferOverflowException 如果位置大于限制 - 4。 ReadOnlyBufferException 如果不对该缓冲区的内容进行任何更改。
答案 1 :(得分:0)
您正在多次运行该功能。每次运行函数时,它都会在第一个函数之后将一个新整数放入缓冲区。但是,没有足够的空间。您需要在函数内声明字节缓冲区。
答案 2 :(得分:0)
第二次调用方法时,代码会溢出。这是因为您为一个整数分配了足够的空间,但是您没有重置缓冲区。因此,当您第二次调用时,缓冲区已满,您将获得异常。
试试这个:
public static byte[] intToBytes(int Value)
{
intBuffer.clear();
intBuffer.order(ByteOrder.LITTLE_ENDIAN);
intBuffer.putInt(Value);
return intBuffer.array();
}
旁注:我怀疑你需要缓存这个对象。