Сведения о вопросе

SOON

20:53, 13th August, 2020

Теги

java   serialization    

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

Просмотров: 572   Ответов: 4

У меня есть двоичные данные в файле, которые я могу считывать в массив байтов и обрабатывать без проблем. Теперь мне нужно отправить части данных по сетевому соединению в виде элементов в документе 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 Для решения этой проблемы.



  Сведения об ответе

piter

23:04, 23rd August, 2020

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

Кодирование как base64 является хорошим решением. Именно так файлы отправляются по SMTP (e-mail). Проект (free) 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();
    }
  }
}


  Сведения об ответе

$DOLLAR

09:18, 28th August, 2020

Если вы закодируете его в base64, это превратит любые данные в ascii безопасный текст, но base64 закодированных данных больше, чем исходные данные


  Сведения об ответе

PIRLO

05:17, 25th August, 2020

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

Использовать http://commons.apache.org/codec/

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


  Сведения об ответе

ASER

04:47, 9th August, 2020

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

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

---EDIT:

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться