Je voudrais convertir un tableau de caractères en un tableau d'octets en Java. Quelles méthodes existent pour effectuer cette conversion ?
Réponses
Trop de publicités?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 ß € 嗨
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));
- Réponses précédentes
- Plus de réponses