Domanda

Ho dati binari in un file che posso leggere in un array di byte ed elaborare senza problemi.Ora devo inviare parti dei dati tramite una connessione di rete come elementi in un documento XML.Il mio problema è che quando converto i dati da un array di byte in una stringa e di nuovo in un array di byte, i dati vengono danneggiati.L'ho testato su una macchina per isolare il problema nella conversione della stringa, quindi ora so che non viene danneggiato dal parser XML o dal trasporto di rete.

Quello che ho adesso è

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

Qualcuno sa come convertire il binario in String e viceversa senza perdita di dati?

Risposto:Grazie Sam.Mi sento un idiota.Ho ricevuto risposta ieri perché il mio parser SAX si stava lamentando.Per qualche motivo, quando mi sono imbattuto in questo problema apparentemente separato, non mi è venuto in mente che si trattasse di un nuovo sintomo dello stesso problema.

MODIFICARE:Solo per ragioni di completezza, ho usato il file Base64 classe da Apache Commons Codec pacchetto per risolvere questo problema.

È stato utile?

Soluzione

Se lo codifichi in base64, questo trasformerà tutti i dati in testo sicuro ascii, ma i dati codificati in base64 sono più grandi dei dati originali

Altri suggerimenti

Stringa(byte[]) tratta i dati come la codifica dei caratteri predefinita.Pertanto, il modo in cui i byte vengono convertiti da valori a 8 bit a caratteri Java Unicode a 16 bit varierà non solo tra i sistemi operativi, ma può anche variare tra utenti diversi che utilizzano codepage diverse sulla stessa macchina!Questo costruttore è utile solo per decodificare uno dei tuoi file di testo.Non provare a convertire byte arbitrari in caratteri in Java!

Codifica come base64 è una buona soluzioneEcco come i file vengono inviati tramite SMTP (e-mail).L'Apache (gratuito). Codec comune il progetto farà il lavoro.

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

In alternativa è possibile utilizzare Java 6 Convertitoretipodati:

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

Vedi questa domanda, Come si incorporano i dati binari in XML?Invece di convertire byte[] in String e poi inserirlo in XML da qualche parte, converti byte[] in una String tramite la codifica BASE64 (alcune librerie XML hanno un tipo che fa questo per te).La decodifica BASE64 una volta recuperata la stringa da XML.

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

I tuoi dati potrebbero essere incasinati a causa di tutti i tipi di strane restrizioni sul set di caratteri e della presenza di caratteri non stampabili.Bastone con BASE64.

Come stai costruendo il tuo documento XML?Se utilizzi le classi XML integrate di Java, la codifica delle stringhe dovrebbe essere gestita per te.

Dai un'occhiata ai pacchetti javax.xml e org.xml.Questo è ciò che utilizziamo per generare documenti XML e gestisce abbastanza bene tutta la codifica e decodifica delle stringhe.

---MODIFICARE:

Hmm, penso di aver frainteso il problema.Non stai cercando di codificare una stringa regolare, ma un insieme di dati binari arbitrari?In tal caso la codifica Base64 suggerita in un commento precedente è probabilmente la strada da percorrere.Credo che sia un modo abbastanza standard di codificare i dati binari in XML.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top