convert array java arrays type-conversion

convert - object to array java



Convertir char[] a byte (6)

Edición: la respuesta de Andrey se ha actualizado, por lo que ya no se aplica lo siguiente.

La respuesta de Andrey (la más votada en el momento de escribir) es ligeramente incorrecta. Habría agregado esto como comentario pero no tengo la suficiente reputación.

En la respuesta de Andrés:

char[] chars = {''c'', ''h'', ''a'', ''r'', ''s''} byte[] bytes = Charset.forName("UTF-8").encode(CharBuffer.wrap(chars)).array();

la llamada a array () puede no devolver el valor deseado, por ejemplo:

char[] c = "aaaaaaaaaa".toCharArray(); System.out.println(Arrays.toString(Charset.forName("UTF-8").encode(CharBuffer.wrap(c)).array()));

salida:

[97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0]

Como se puede ver se ha añadido un byte cero. Para evitar esto usa lo siguiente:

char[] c = "aaaaaaaaaa".toCharArray(); ByteBuffer bb = Charset.forName("UTF-8").encode(CharBuffer.wrap(c)); byte[] b = new byte[bb.remaining()]; bb.get(b); System.out.println(Arrays.toString(b));

salida:

[97, 97, 97, 97, 97, 97, 97, 97, 97, 97]

Como la respuesta también alude al uso de contraseñas, podría valer la pena eliminar la matriz que respalda el ByteBuffer (accesible a través de la función array ()):

ByteBuffer bb = Charset.forName("UTF-8").encode(CharBuffer.wrap(c)); byte[] b = new byte[bb.remaining()]; bb.get(b); blankOutByteArray(bb.array()); System.out.println(Arrays.toString(b));

Me gustaría convertir una matriz de caracteres en una matriz de bytes en Java. ¿Qué métodos existen para hacer esta conversión?


Convertir sin crear objeto String :

private byte[] toBytes(char[] chars) { CharBuffer charBuffer = CharBuffer.wrap(chars); ByteBuffer byteBuffer = Charset.forName("UTF-8").encode(charBuffer); byte[] bytes = Arrays.copyOfRange(byteBuffer.array(), byteBuffer.position(), byteBuffer.limit()); Arrays.fill(byteBuffer.array(), (byte) 0); // clear sensitive data return bytes; }

Uso:

char[] chars = {''0'', ''1'', ''2'', ''3'', ''4'', ''5'', ''6'', ''7'', ''8'', ''9''}; byte[] bytes = toBytes(chars); /* do something with chars/bytes */ Arrays.fill(chars, ''/u0000''); // clear sensitive data Arrays.fill(bytes, (byte) 0); // clear sensitive data

La solución está inspirada en la recomendación de Swing para almacenar contraseñas en char []. (Consulte ¿Por qué se prefiere char [] a String para las contraseñas? )

Recuerde no escribir datos confidenciales en los registros y asegurarse de que JVM no tendrá ninguna referencia a ellos.


En realidad, char y byte pueden tener diferentes tamaños en Java, ya que char puede contener cualquier carácter Unicode, que puede alcanzar hasta 16 bits.


Podrías hacer un método:

public byte[] toBytes(char[] data) { byte[] toRet = new byte[data.length]; for(int i = 0; i < toRet.length; i++) { toRet[i] = (byte) data[i]; } return toRet; }

Espero que esto ayude


char[] ch = ? new String(ch).getBytes();

o

new String(ch).getBytes("UTF-8");

para obtener el conjunto de caracteres no predeterminado.

Actualización: Desde Java 7: new String(ch).getBytes(StandardCharsets.UTF_8);


private static byte[] charArrayToByteArray(char[] c_array) { byte[] b_array = new byte[c_array.length]; for(int i= 0; i < c_array.length; i++) { b_array[i] = (byte)(0xFF & (int)c_array[i]); } return b_array; }