2016-11-04 18 views
2

Я попытался преобразовать int в byte[] и написал для этого следующее:Как преобразовать int в байт []?

byte[] bytes = new bytes[4]; 
ByteBuffer buff = ByteBuffer.allocate(4); 
buff.putInt(1222); 
buff.get(bytes); 

, но в результате я был java.nio.BufferOverflowException без детального сообщения.

Как для меня код действителен. Что не так? Как конвертировать int в byte[]?

+0

В какой строке вы видите эту ошибку? – arminb

+0

buff.get (bytes) –

ответ

5

Вы забыли flip() свой буфер после ввода данных в систему.

После того, как вы поместите int в буфере, позиция находится в конце буфера. Попытка чтения данных приводит к BufferUnderflowException (не переполнение), поскольку в буфере нет байтов.

6

Аналогичный ответ, который не требует вызова flip().

byte[] bytes = new byte[4]; 
ByteBuffer.wrap(bytes).putInt(0x12345678); 
System.out.println(Arrays.toString(bytes)); 

печатает http://ideone.com/Ab4Z4V

[18, 52, 86, 120] 

Это 0x12, 0x34, 0x56 и 0x78

2

Подобно вашим собственным решением, но немного более кратким, то результат непосредственно в массиве.

byte[] bytes = new byte[4]; 
    // BigEndian 
    ByteBuffer.wrap(bytes).putInt(1222); 
    // LittleEndian 
    ByteBuffer.wrap(bytes).order(LITTLE_ENDIAN).putInt(1222); 
0

Это мой подход к достижению его:

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

Имейте в виду, что этот подход использовать только число байтов требуется для представления числа, это означает, что если число невелико используйте меньше байтов.