programacion array java arrays integer byte

programacion - integer to byte array java



Entero de Java a matriz de bytes (12)

Tengo un número entero: 1695609641

cuando uso el método:

String hex = Integer.toHexString(1695609641); system.out.println(hex);

da:

6510f329

pero quiero una matriz de bytes:

byte[] bytearray = new byte[] { (byte) 0x65, (byte)0x10, (byte)0xf3, (byte)0x29};

¿Cómo puedo hacer esto?


Debido a que en general querrá convertir esta matriz de nuevo a una int en un momento posterior, aquí están los métodos para convertir una matriz de ints en una matriz de bytes y viceversa:

public static byte[] convertToByteArray(final int[] pIntArray) { final byte[] array = new byte[pIntArray.length * 4]; for (int j = 0; j < pIntArray.length; j++) { final int c = pIntArray[j]; array[j * 4] = (byte)((c & 0xFF000000) >> 24); array[j * 4 + 1] = (byte)((c & 0xFF0000) >> 16); array[j * 4 + 2] = (byte)((c & 0xFF00) >> 8); array[j * 4 + 3] = (byte)(c & 0xFF); } return array; } public static int[] convertToIntArray(final byte[] pByteArray) { final int[] array = new int[pByteArray.length / 4]; for (int i = 0; i < array.length; i++) array[i] = (((int)(pByteArray[i * 4]) << 24) & 0xFF000000) | (((int)(pByteArray[i * 4 + 1]) << 16) & 0xFF0000) | (((int)(pByteArray[i * 4 + 2]) << 8) & 0xFF00) | ((int)(pByteArray[i * 4 + 3]) & 0xFF); return array; }

Tenga en cuenta que debido a la propagación de la señal y tal, el "& 0xFF ..." son necesarios al convertir de nuevo a la int.


La clase org.apache.hadoop.hbase.util.Bytes tiene un montón de métodos de conversión de bytes útiles [], pero es posible que no desee agregar todo el jar de HBase a su proyecto solo para este propósito. Es sorprendente que este método no solo contenga AFAIK del JDK, sino también de librerías obvias como el commons io.


Los siguientes fragmentos funcionan al menos para enviar un int sobre UDP.

int a la matriz de bytes:

public byte[] intToBytes(int my_int) throws IOException { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutput out = new ObjectOutputStream(bos); out.writeInt(my_int); out.close(); byte[] int_bytes = bos.toByteArray(); bos.close(); return int_bytes; }

matriz de bytes a int:

public int bytesToInt(byte[] int_bytes) throws IOException { ByteArrayInputStream bis = new ByteArrayInputStream(int_bytes); ObjectInputStream ois = new ObjectInputStream(bis); int my_int = ois.readInt(); ois.close(); return my_int; }


Mi intento:

public static byte[] toBytes(final int intVal, final int... intArray) { if (intArray == null || (intArray.length == 0)) { return ByteBuffer.allocate(4).putInt(intVal).array(); } else { final ByteBuffer bb = ByteBuffer.allocate(4 + (intArray.length * 4)).putInt(intVal); for (final int val : intArray) { bb.putInt(val); } return bb.array(); } }

Con eso puedes hacer esto:

byte[] fourBytes = toBytes(0x01020304); byte[] eightBytes = toBytes(0x01020304, 0x05060708);

La clase completa está aquí: https://gist.github.com/superbob/6548493 , admite la inicialización de cortos o largos

byte[] eightBytesAgain = toBytes(0x0102030405060708L);


Qué tal si:

public static final byte[] intToByteArray(int value) { return new byte[] { (byte)(value >>> 24), (byte)(value >>> 16), (byte)(value >>> 8), (byte)value}; }

La idea no es mia Lo tomé de alguna publicación en dzone.com .


Usando Guava :

byte[] bytearray = Ints.toByteArray(1695609641);


Usar ByteBuffer Java NIO es muy simple:

byte[] bytes = ByteBuffer.allocate(4).putInt(1695609641).array(); for (byte b : bytes) { System.out.format("0x%x ", b); }

salida:

0x65 0x10 0xf3 0x29


BigInteger.valueOf(1695609641).toByteArray()


byte[] IntToByteArray( int data ) { byte[] result = new byte[4]; result[0] = (byte) ((data & 0xFF000000) >> 24); result[1] = (byte) ((data & 0x00FF0000) >> 16); result[2] = (byte) ((data & 0x0000FF00) >> 8); result[3] = (byte) ((data & 0x000000FF) >> 0); return result; }


byte[] conv = new byte[4]; conv[3] = (byte) input & 0xff; input >>= 8; conv[2] = (byte) input & 0xff; input >>= 8; conv[1] = (byte) input & 0xff; input >>= 8; conv[0] = (byte) input;


integer & 0xFF

para el primer byte

(integer >> 8) & 0xFF

para el segundo y bucle etc., escribiendo en una matriz de bytes preasignada. Un poco desordenado, por desgracia.


public static byte[] intToBytes(int x) throws IOException { ByteArrayOutputStream bos = new ByteArrayOutputStream(); DataOutputStream out = new DataOutputStream(bos); out.writeInt(x); out.close(); byte[] int_bytes = bos.toByteArray(); bos.close(); return int_bytes; }