Как зайти в Даркнет?!
25th January, 01:11
8
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
898
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
950
0
Очень долго работает Update запрос Oracle
27th January, 09:58
916
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
907
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
941
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1725
0
период по дням
25th October, 10:44
3957
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3722
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4614
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4382
0
Помогите пожалуйста решить задачи
24th November, 23:53
6087
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4352
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4398
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Как вы преобразуете двоичные данные в строки и обратно в Java?
У меня есть двоичные данные в файле, которые я могу считывать в массив байтов и обрабатывать без проблем. Теперь мне нужно отправить части данных по сетевому соединению в виде элементов в документе 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 Для решения этой проблемы.
Строка (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();
}
}
}
Смотрите этот вопрос, Как вы внедряете двоичные данные в XML? Вместо того чтобы преобразовывать byte[] в строку, а затем где-то толкать в XML, преобразуйте byte[] в строку через кодировку BASE64 (некоторые библиотеки XML имеют тип, чтобы сделать это за вас). BASE64 декодируется, как только вы получаете строку обратно от XML.
Использовать http://commons.apache.org/codec/
Ваши данные могут быть перепутаны из-за всевозможных странных ограничений набора символов и наличия непритязательных символов. Палка w/ BASE64.
Как вы строите свой документ XML? Если вы используете встроенные классы java в XML, то кодировка строк должна обрабатываться за вас.
Взгляните на пакеты javax.xml и org.xml. Это то, что мы используем для создания XML docs, и он довольно хорошо обрабатывает все кодирование и декодирование строк.
---EDIT:
Хм, я думаю, что неправильно понял проблему. Вы не пытаетесь закодировать обычную строку, а какой-то набор произвольных двоичных данных? В этом случае кодировка Base64, предложенная в предыдущем комментарии, вероятно, является правильным решением. Я считаю, что это довольно стандартный способ кодирования двоичных данных в XML.