2014-12-02 4 views
1

Мне нужно преобразовать значение Integer в массив байтов. Чтобы не создавать ByteBuffer снова и снова при каждом вызове моего метода intToBytes, я определил статический ByteBuffer.Преобразование int в байтовый массив BufferOverflowException

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

Я получаю BufferOverflowException при запуске метода intToBytes.

Вт/System.err: java.nio.BufferOverflowException Вт/System.err: в java.nio.ByteArrayBuffer.putInt (ByteArrayBuffer.java:352) Вт/System.err: в android.mobile.historian .Data.Convert.intToBytes (Convert.java:136)

В режиме отладки я вижу, что емкость intBuffer равна 4, как я ожидал для своего значения Integer. Так что тут не так?

enter image description here

+1

Запахи как преждевременная оптимизация для меня. Вы доказали, что воссоздание этого объекта является узким местом в вашей заявке? Если нет, не беспокойтесь об этом ... –

ответ

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 преобразуется в байтах, используя текущий порядок байтов. Throws BufferOverflowException если позиция больше предела - 4. ReadOnlyBufferException , если в содержимое этого буфера не могут быть внесены изменения.

+0

Мне потребовалось некоторое время, чтобы заметить, что ваш ответ был здесь. Вероятно, вам следует выделить дополнение 'clear()' в приведенном выше коде. Параграф под кодом недостаточно адаптирован к этому вопросу. –

+0

э-э, я как-то ответил в спешке:/ – Dexter

+0

Спасибо @Dexter за ответ. Пока я тестирую это, я также заметил, что могу установить начальный индекс для буфера. Если я скажу intBuffer.putInt (0, Value); он ведет себя как clear(). – Demir

0

Вы работаете в функции несколько раз. Каждый раз, когда вы запускаете свою функцию, она помещает новое целое число в буфер после первого. Однако места недостаточно. Вам нужно объявить буфер байта внутри вашей функции.

0

Ваш код переполняется во второй раз, когда вы вызываете метод. Это связано с тем, что вы выделили достаточно места для одного целого, но вы не сбросили буфер. Поэтому, когда вы вызываете второй раз, буфер уже заполнен, и вы получаете исключение.

Попробуйте это:

public static byte[] intToBytes(int Value) 
{ 
    intBuffer.clear(); 
    intBuffer.order(ByteOrder.LITTLE_ENDIAN); 
    intBuffer.putInt(Value); 
    return intBuffer.array(); 
} 

Side Примечание: Я сомневаюсь, что вам нужно кэшировать этот объект.

Смежные вопросы