Как преобразовать двоичные данные в строки и обратно в Java?

голоса
27

У меня есть двоичные данные в файл, который я могу читать в массив байт и процесс без проблем. Теперь мне нужно отправить части данных по сети в качестве элементов в документе XML. Моя проблема заключается в том, что, когда я преобразовать данные из массива байт в строку и обратно в массив байт, данные поврежденная. Я испытал это на одной машине, чтобы изолировать проблему для преобразования строкового, так что теперь я знаю, что это не поврежденным анализатором XML или транспортной сети.

То, что у меня прямо сейчас

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

Кто-нибудь знает, как преобразовать двоичный в строку и обратно без потери данных?

Ответ: Спасибо Сэм. Я чувствую себя идиотом. Я это ответил вчера, потому что мой SAX парсер жаловался. По какой-то причине, когда я столкнулся с этим, казалось бы, отдельный вопрос, она не приходила мне в голову, что это был новый симптом той же проблемы.

EDIT: Просто для полноты картины , я использовал Base64 класс от Apache Commons Codec пакета , чтобы решить эту проблему.

Задан 21/08/2008 в 19:51
источник пользователем
На других языках...                            


4 ответов

голоса
35

Строка (байты []) обрабатывают данные как кодирование символов по умолчанию. Итак, как байты преобразуются из 8-битных значений в 16-битных символов Unicode Java будет меняться не только между операционными системами, но даже может варьироваться от различных пользователей , использующих различные кодовые страницы на одной машине! Этот конструктор хорош только для декодирования одного из ваших собственных текстовых файлов. Не пытайтесь конвертировать произвольные байты символов в Java!

Кодирование в base64 является хорошим решением. Это как файлы передаются через SMTP (электронная почта). (Бесплатно) Apache Commons Codec проект будет делать эту работу.

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

Кроме того , вы можете использовать Java 6 DatatypeConverter :

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();
    }
  }
}
Ответил 21/08/2008 в 20:19
источник пользователем

голоса
19

Если вы закодировать в base64, это превратит любые данные в ASCII безопасный текст, но base64 кодированные данные больше Orignal данных

Ответил 21/08/2008 в 19:54
источник пользователем

голоса
2

Смотрите этот вопрос, Как встраивать двоичные данные в XML? Вместо преобразования байт [] в строку убирания в XML - нибудь, преобразовать байт [] в строку с помощью кодирования BASE64 (некоторые библиотеки XML имеют тип , чтобы сделать это для вас). BASE64 расшифровывает , как только вы получите строку обратно из XML.

Используйте http://commons.apache.org/codec/

Вы данные могут получать перепутались из-за разного рода странных наборов символов ограничений и наличие не-Priting символов. Стик ж / BASE64.

Ответил 21/08/2008 в 20:13
источник пользователем

голоса
0

Как вы строите свой XML-документ? Если вы используете Java, построенные в классах XML, то строка кодирование должно быть обработано для вас.

Возьмите взгляд на javax.xml и org.xml пакетов. Это то, что мы используем для создания XML-документов, и он обрабатывает кодирование и декодирование всех строк довольно красиво.

---РЕДАКТИРОВАТЬ:

Хм, я думаю, что я понял проблему. Вы не пытаетесь кодировать обычную строку, но некоторый набор произвольных двоичных данных? В этом случае кодирование Base64 предложено в предыдущем комментарии, вероятно, путь. Я считаю, что это довольно стандартным способом кодирования двоичных данных в XML.

Ответил 21/08/2008 в 20:10
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more