347 votes

comment convertir un tableau d'octets en chaîne et vice versa

Je dois convertir un tableau d'octets en chaîne dans Android, mais mon tableau d'octets contient des valeurs négatives.

Si je convertis à nouveau cette chaîne en tableau d'octets, les valeurs que je récupère sont différentes des valeurs d'origine du tableau d'octets.

Que puis-je faire pour obtenir une conversion correcte? Le code que j'utilise pour effectuer la conversion est le suivant:

 // Code to convert byte arr to str:
byte[] by_original = {0,1,-2,3,-4,-5,6};
String str1 = new String(by_original);
System.out.println("str1 >> "+str1);

// Code to convert str to byte arr:
byte[] by_new = str1.getBytes();
for(int i=0;i<by_new.length;i++) 
System.out.println("by1["+i+"] >> "+str1);
 

Je suis coincé dans ce problème.

513voto

omerkudat Points 2536

Votre tableau d'octets doit avoir un certain encodage. Le codage ne peut pas être ASCII si vous avez des valeurs négatives. Une fois que vous avez compris cela, vous pouvez convertir un ensemble d'octets en chaîne en utilisant:

 byte[] bytes = {...}
String str = new String(bytes, "UTF-8"); // for UTF-8 encoding
 

Vous pouvez utiliser un grand nombre d’encodages. Regardez la classe Charset dans les javadocs de Sun.

120voto

Michael Borgwardt Points 181658

La "conversion correcte" entre byte[] et la Chaîne est explicitement état de l'encodage que vous souhaitez utiliser. Si vous commencez avec un byte[] et il ne contient en effet des données de texte, il n' est pas "une conversion". Les chaînes sont pour le texte, byte[] pour des données binaires, et la seule vraiment la chose la plus sensée à faire est d' éviter la conversion d'entre eux, sauf si vous devez absolument.

Si vous devez vraiment utiliser une Chaîne de caractères qui contient des données binaires puis la façon la plus sûre est d'utiliser Base64 encodage.

45voto

Stephen C Points 255558

La racine du problème est (je pense) que vous êtes involontairement à l'aide d'un jeu de caractères pour lesquels:

 bytes != encode(decode(bytes))

dans certains cas. UTF-8 est un exemple de ce type de jeu de caractères. Plus précisément, certaines séquences d'octets ne sont pas valides encodages en UTF-8. Si l'UTF-8 décodeur rencontres une de ces séquences, il est de nature à jeter la délinquance octets ou de décoder le format Unicode codepoint de "caractère". Naturellement, lorsque vous essayez ensuite de coder les caractères comme des octets, le résultat sera différent.

La solution est:

  1. Soyez explicite sur l'encodage de caractères que vous utilisez; c'est à dire utiliser une Chaîne de constructeur et d' String.toByteArray méthode explicite charset.
  2. Utiliser le jeu de caractères pour votre octet de données ... ou sinon (comme "Latin-1", où toutes les séquences d'octets de la carte valide de caractères Unicode.

34voto

Il semble que nous ayons juste besoin de construire un nouvel objet string avec le tableau: http://www.mkyong.com/java/how-do-convert-byte-array-to-string-in-java/

16voto

sfussenegger Points 16204

Utiliser new String (byOriginal) et reconvertir en byte [] en utilisant getBytes () ne garantit pas deux octets [] avec des valeurs égales. Cela est dû à un appel à StringCoding.encode (..) qui encodera la chaîne en charset.defaultCharset () . Pendant ce codage, le codeur peut choisir de remplacer des caractères inconnus et d’apporter d’autres modifications. Par conséquent, l'utilisation de String.getBytes () peut ne pas renvoyer un tableau identique à celui que vous avez initialement transmis au constructeur.

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