2015-09-17 2 views
1

У меня есть counter, который считает от 0 до 32767BufferOverflowException при преобразовании Int к байту

На каждом шаге, я хочу, чтобы преобразовать counter (INT) в массив 2 байта.

Я попытался это, но я получил BufferOverflowException исключение:

byte[] bytearray = ByteBuffer.allocate(2).putInt(counter).array(); 
+0

Ну, что вы ожидаете? Вы пытаетесь поместить 4 байта в буфер длиной 2 байта. – fge

+0

Что вы пытаетесь достичь? –

+0

изменено максимальное число до 32767 Если я сделаю это, сдвинув, значение 128 будет -128. Но мне нужны positiv байты – Struct

ответ

2

Да , это связано с тем, что int занимает 4 байта в буфере, независимо от значения.

ByteBuffer.putInt ясно о том, как это и за исключением:

записывает четыре байта, содержащие данную Int значение, в текущем порядке байтов, в этот буфер в текущей позиции, а затем увеличивает положение с помощью четырех ,

...

Броски:
BufferOverflowException - Если есть оставшиеся в этом буфере

менее четырех байтов для записи двух байтов, используйте putShort вместо ... и в идеале изменить ваша counter переменная должна быть short, а также для того, чтобы было ясно, какой диапазон должен быть.

+0

Он работает с использованием коротких, но если счетчик достигает 128, преобразованный байт будет -128 вместо 128 – Struct

+0

@Struct: это будет соответствующий набор бит - это просто '' byte' в Java (к сожалению) подписан. * * Значение 'no' byte' 128.Независимо от того, что преобразует двухбайтовое значение обратно в «короткий», вы получите правильное значение. –

2

Во-первых, кажется, предполагают, что ИНТ большой байтов. Ну, это 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; 
} 
1

Это должно работать

записывает два байта, содержащие данное короткое значение, в текущем порядке байт

, в этот буфер в текущей позиции, а затем

увеличивает позицию два.

byte[] bytearray = ByteBuffer.allocate(2).putShort((short)counter).array(); 
Смежные вопросы