Comment convertir des données binaires en chaînes et inversement en Java ?

StackOverflow https://stackoverflow.com/questions/20778

  •  09-06-2019
  •  | 
  •  

Question

J'ai des données binaires dans un fichier que je peux lire dans un tableau d'octets et traiter sans problème.Je dois maintenant envoyer des parties des données via une connexion réseau en tant qu'éléments dans un document XML.Mon problème est que lorsque je convertis les données d'un tableau d'octets en chaîne, puis de nouveau en un tableau d'octets, les données sont corrompues.J'ai testé cela sur une machine pour isoler le problème de la conversion de chaîne. Je sais donc maintenant qu'il n'est pas corrompu par l'analyseur XML ou le transport réseau.

Ce que j'ai en ce moment c'est

byte[] buffer = ...; // read from file
// a few lines that prove I can process the data successfully
String element = new String(buffer);
byte[] newBuffer = element.getBytes();
// a few lines that try to process newBuffer and fail because it is not the same data anymore

Est-ce que quelqu'un sait comment convertir un binaire en String et inversement sans perte de données ?

Répondu :Merci Sam.Je me sens idiot.J'ai eu cette réponse hier parce que mon analyseur SAX se plaignait.Pour une raison quelconque, lorsque j'ai rencontré ce problème apparemment distinct, il ne m'est pas venu à l'esprit qu'il s'agissait d'un nouveau symptôme du même problème.

MODIFIER:Par souci d'exhaustivité, j'ai utilisé le Base64 classe de la Apache Commons Codec package pour résoudre ce problème.

Était-ce utile?

La solution

Si vous l'encodez en base64, toutes les données seront transformées en texte sécurisé ascii, mais les données codées en base64 sont plus volumineuses que les données d'origine.

Autres conseils

Chaîne (octet []) traite les données comme codage de caractères par défaut.Ainsi, la façon dont les octets sont convertis de valeurs 8 bits en caractères Java Unicode 16 bits variera non seulement entre les systèmes d'exploitation, mais peut même varier entre différents utilisateurs utilisant différentes pages de codes sur la même machine !Ce constructeur n'est utile que pour décoder l'un de vos propres fichiers texte.N'essayez pas de convertir des octets arbitraires en caractères en Java !

Encodage comme base64 est une bonne solution.C'est ainsi que les fichiers sont envoyés via SMTP (e-mail).L'Apache (gratuit) Codec commun le projet fera l’affaire.

byte[] bytes = loadFile(file);          
//all chars in encoded are guaranteed to be 7-bit ASCII
byte[] encoded = Base64.encodeBase64(bytes);
String printMe = new String(encoded, "US-ASCII");
System.out.println(printMe);
byte[] decoded = Base64.decodeBase64(encoded);

Alternativement, vous pouvez utiliser Java 6 Convertisseur de type de données:

import java.io.*;
import java.nio.channels.*;
import javax.xml.bind.DatatypeConverter;

public class EncodeDecode {    
  public static void main(String[] args) throws Exception {
    File file = new File("/bin/ls");
    byte[] bytes = loadFile(file, new ByteArrayOutputStream()).toByteArray();
    String encoded = DatatypeConverter.printBase64Binary(bytes);
    System.out.println(encoded);
    byte[] decoded = DatatypeConverter.parseBase64Binary(encoded);
    // check
    for (int i = 0; i < bytes.length; i++) {
      assert bytes[i] == decoded[i];
    }
  }

  private static <T extends OutputStream> T loadFile(File file, T out)
                                                       throws IOException {
    FileChannel in = new FileInputStream(file).getChannel();
    try {
      assert in.size() == in.transferTo(0, in.size(), Channels.newChannel(out));
      return out;
    } finally {
      in.close();
    }
  }
}

Voir cette question, Comment intégrer des données binaires dans XML ?Au lieu de convertir le byte[] en String puis de le transmettre en XML quelque part, convertissez le byte[] en String via le codage BASE64 (certaines bibliothèques XML ont un type pour le faire pour vous).Le décodage BASE64 une fois que vous récupérez la chaîne de XML.

Utiliser http://commons.apache.org/codec/

Vos données peuvent être gâchées en raison de toutes sortes de restrictions de jeux de caractères étranges et de la présence de caractères non imprimables.Restez avec BASE64.

Comment construisez-vous votre document XML ?Si vous utilisez les classes XML intégrées à Java, le codage de la chaîne doit être géré pour vous.

Jetez un œil aux packages javax.xml et org.xml.C'est ce que nous utilisons pour générer des documents XML, et il gère assez bien tout l'encodage et le décodage des chaînes.

---MODIFIER:

Hmm, je pense que j'ai mal compris le problème.Vous n'essayez pas d'encoder une chaîne normale, mais un ensemble de données binaires arbitraires ?Dans ce cas, le codage Base64 suggéré dans un commentaire précédent est probablement la voie à suivre.Je pense que c'est une manière assez standard de coder des données binaires en XML.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top