将int转换为字节数组BufferOverflowException

时间:2014-12-02 12:35:43

标签: java android

我需要将我的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值的预期。那么这里有什么问题?

enter image description here

3 个答案:

答案 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();
}

旁注:我怀疑你需要缓存这个对象。