Conversión de char en byte

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

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

o

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

para obtener un juego de caracteres no predeterminado.

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

Convierte sin crear un 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(charBuffer.array(), '\u0000'); // clear sensitive data 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 [] sobre String para contraseñas? )

Recuerde no escribir datos confidenciales en los registros y asegúrese de que JVM no contenga ninguna referencia al mismo.

Editar: la respuesta de Andrey se ha actualizado, por lo que ya no se aplica.

La respuesta de Andrey (la más votada al momento de escribir) es ligeramente incorrecta. Hubiera agregado esto como comentario pero no soy lo suficientemente respetable.

En la respuesta de Andrey:

 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 agregado un byte cero. Para evitar esto, use 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 aludía al uso de contraseñas, vale la pena borrar el conjunto que respalda el ByteBuffer (al que se accede 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)); 
 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; } 

En realidad, char y byte pueden tener diferentes tamaños en Java, ya que char puede contener cualquier caracter Unicode, que puede llegar 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