Pergunta

Tenho dados binários em um arquivo que posso ler em uma matriz de bytes e processar sem problemas.Agora preciso enviar partes dos dados através de uma conexão de rede como elementos em um documento XML.Meu problema é que quando eu converto os dados de uma matriz de bytes para uma String e de volta para uma matriz de bytes, os dados ficam corrompidos.Eu testei isso em uma máquina para isolar o problema da conversão de String, então agora sei que ele não está sendo corrompido pelo analisador XML ou pelo transporte de rede.

O que eu tenho agora é

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

Alguém sabe como converter binário em String e vice-versa sem perda de dados?

Respondidas:Obrigado Sam.Me sinto como um idiota.Recebi isso ontem porque meu analisador SAX estava reclamando.Por alguma razão, quando me deparei com esse problema aparentemente separado, não me ocorreu que fosse um novo sintoma do mesmo problema.

EDITAR:Apenas para completar, usei o Base64 aula do Apache Commons Codec pacote para resolver este problema.

Foi útil?

Solução

Se você codificá-lo em base64, isso transformará todos os dados em texto seguro ASCII, mas os dados codificados em base64 serão maiores que os dados originais

Outras dicas

String(byte[]) trata os dados como a codificação de caracteres padrão.Portanto, a forma como os bytes são convertidos de valores de 8 bits para caracteres Java Unicode de 16 bits irá variar não apenas entre sistemas operacionais, mas pode até variar entre diferentes usuários usando diferentes páginas de código na mesma máquina!Este construtor só é bom para decodificar um de seus próprios arquivos de texto.Não tente converter bytes arbitrários em caracteres em Java!

Codificando como base64 é uma boa solução.É assim que os arquivos são enviados por SMTP (e-mail).O Apache (gratuito) Codec Comum projeto fará o trabalho.

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

Alternativamente, você pode usar o Java 6 Conversor de tipo de dados:

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

Veja esta pergunta, Como você incorpora dados binários em XML?Em vez de converter o byte[] em String e depois enviar para XML em algum lugar, converta o byte[] em String por meio da codificação BASE64 (algumas bibliotecas XML têm um tipo para fazer isso para você).A decodificação BASE64 assim que você recuperar a String do XML.

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

Seus dados podem estar ficando confusos devido a todos os tipos de restrições estranhas de conjunto de caracteres e à presença de caracteres não-principais.Fique com BASE64.

Como você está construindo seu documento XML?Se você usar classes XML integradas em Java, a codificação da string deverá ser tratada para você.

Dê uma olhada nos pacotes javax.xml e org.xml.É isso que usamos para gerar documentos XML, e ele lida muito bem com toda a codificação e decodificação de strings.

---EDITAR:

Hmm, acho que entendi mal o problema.Você não está tentando codificar uma string normal, mas algum conjunto de dados binários arbitrários?Nesse caso, a codificação Base64 sugerida em um comentário anterior é provavelmente o caminho a seguir.Acredito que seja uma forma bastante padrão de codificar dados binários em XML.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top