92 votes

Conversion de char[] en byte[]

Je voudrais convertir un tableau de caractères en un tableau d'octets en Java. Quelles méthodes existent pour effectuer cette conversion ?

181voto

andreyne Points 3652

Convertir sans créer String objet :

import java.nio.CharBuffer;
import java.nio.ByteBuffer;
import java.util.Arrays;

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 solution est inspirée de la recommandation de Swing de stocker les mots de passe dans char[]. (Voir Pourquoi char[] est-il préféré à String pour les mots de passe ? )

N'oubliez pas de ne pas écrire de données sensibles dans les journaux et assurez-vous que la JVM ne conserve aucune référence à ces données.


Le code ci-dessus est correct mais pas efficace. Si vous n'avez pas besoin de performances mais que vous voulez de la sécurité, vous pouvez l'utiliser. Si la sécurité n'est pas non plus un objectif, faites simplement String.getBytes . Le code ci-dessus n'est pas efficace si vous regardez vers le bas de la mise en œuvre de encode dans le JDK. En outre, vous devez copier des tableaux et créer des tampons. Une autre façon de convertir est de mettre en ligne tout le code derrière encode (exemple pour UTF-8 ):

val xs: Array[Char] = "A ß € 嗨

83voto

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

ou

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

pour obtenir un jeu de caractères autre que celui par défaut.

Mise à jour : Depuis Java 7 : new String(ch).getBytes(StandardCharsets.UTF_8);

20voto

djsutho Points 173

Edit : La réponse d'Andrey a été mise à jour et ce qui suit n'est plus valable.

La réponse d'Andrey (la plus votée au moment de l'écriture) est légèrement incorrecte. J'aurais bien ajouté ce commentaire, mais je n'ai pas la pas assez réputé.

Dans la réponse d'Andrey :

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

l'appel à array() peut ne pas retourner la valeur souhaitée, par exemple :

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

sortie :

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

Comme on peut le voir, un octet zéro a été ajouté. Pour éviter cela, utilisez ce qui suit :

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

sortie :

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

Comme la réponse fait également allusion à l'utilisation de mots de passe, il peut être intéressant de de vider le tableau qui soutient le ByteBuffer (accessible via la fonction 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));

2voto

Matt Points 39
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;
}

0voto

bvk256 Points 584

En fait, char et byte peuvent avoir des tailles différentes en Java, puisque char peut contenir n'importe quel caractère Unicode, qui peut aller jusqu'à 16 bits.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X