Frage

Ich habe Binärdaten in einer Datei, die ich problemlos in ein Byte-Array einlesen und verarbeiten kann.Jetzt muss ich Teile der Daten als Elemente in einem XML-Dokument über eine Netzwerkverbindung senden.Mein Problem besteht darin, dass die Daten beschädigt werden, wenn ich die Daten von einem Byte-Array in einen String und zurück in ein Byte-Array konvertiere.Ich habe dies auf einem Computer getestet, um das Problem auf die String-Konvertierung einzugrenzen, sodass ich jetzt weiß, dass es nicht durch den XML-Parser oder den Netzwerktransport beschädigt wird.

Was ich gerade habe, ist

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

Weiß jemand, wie man Binärdateien ohne Datenverlust in String und zurück konvertieren kann?

Antwortete:Danke Sam.Ich fühle mich wie ein Idiot.Ich habe diese Frage gestern beantworten lassen, weil sich mein SAX-Parser beschwert hat.Als ich auf dieses scheinbar separate Problem stieß, kam mir aus irgendeinem Grund nicht der Gedanke, dass es sich um ein neues Symptom desselben Problems handelte.

BEARBEITEN:Der Vollständigkeit halber habe ich das verwendet Base64 Klasse aus der Apache Commons Codec Paket zur Lösung dieses Problems.

War es hilfreich?

Lösung

Wenn Sie es in Base64 kodieren, werden alle Daten in sicheren ASCII-Text umgewandelt, aber die mit Base64 kodierten Daten sind größer als die Originaldaten

Andere Tipps

String(Byte[]) Behandelt die Daten als Standardzeichenkodierung.Die Art und Weise, wie Bytes von 8-Bit-Werten in 16-Bit-Java-Unicode-Zeichen konvertiert werden, variiert also nicht nur zwischen den Betriebssystemen, sondern kann sogar zwischen verschiedenen Benutzern variieren, die unterschiedliche Codepages auf demselben Computer verwenden!Dieser Konstruktor eignet sich nur zum Dekodieren einer Ihrer eigenen Textdateien.Versuchen Sie nicht, in Java beliebige Bytes in Zeichen umzuwandeln!

Codierung als base64 ist eine gute Lösung.Auf diese Weise werden Dateien über SMTP (E-Mail) versendet.Der (kostenlose) Apache Commons-Codec Das Projekt wird den Job machen.

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

Alternativ können Sie Java 6 verwenden Datentypkonverter:

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

Siehe diese Frage, Wie bettet man Binärdaten in XML ein?Anstatt das Byte[] in einen String umzuwandeln und es dann irgendwo in XML zu übertragen, konvertieren Sie das Byte[] über die BASE64-Kodierung in einen String (einige XML-Bibliotheken verfügen über einen Typ, der dies für Sie erledigt).Die BASE64-Dekodierung erfolgt, sobald Sie den String aus XML zurückerhalten.

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

Ihre Daten können durch alle möglichen seltsamen Zeichensatzbeschränkungen und das Vorhandensein nicht-prittierender Zeichen durcheinander geraten.Stick mit BASE64.

Wie erstellen Sie Ihr XML-Dokument?Wenn Sie die in Java integrierten XML-Klassen verwenden, sollte die Zeichenfolgenkodierung für Sie erledigt werden.

Schauen Sie sich die Pakete javax.xml und org.xml an.Das ist es, was wir zum Generieren von XML-Dokumenten verwenden, und es erledigt die gesamte String-Kodierung und -Dekodierung recht gut.

---BEARBEITEN:

Hmm, ich glaube, ich habe das Problem falsch verstanden.Sie versuchen nicht, eine reguläre Zeichenfolge zu kodieren, sondern einen Satz beliebiger Binärdaten?In diesem Fall ist die in einem früheren Kommentar vorgeschlagene Base64-Kodierung wahrscheinlich der richtige Weg.Ich glaube, das ist eine ziemlich Standardmethode zum Codieren von Binärdaten in XML.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top