Я должен преобразовать байтовый массив в строку в Android, но мой байтовый массив содержит отрицательные значения.
Если я снова преобразую эту строку в байтовый массив, значения, которые я получаю, отличаются от исходных значений байтового массива.
Что я могу сделать, чтобы получить правильное преобразование? Код, который я использую для преобразования, выглядит следующим образом:
// Code to convert byte arr to str:
byte[] by_original = {0,1,-2,3,-4,-5,6};
String str1 = new String(by_original);
System.out.println("str1 >> "+str1);
// Code to convert str to byte arr:
byte[] by_new = str1.getBytes();
for(int i=0;i<by_new.length;i++)
System.out.println("by1["+i+"] >> "+str1);
Я застрял в этой проблеме.
byte[]
двоичных данных иString
текста?Ответы:
Ваш байтовый массив должен иметь некоторую кодировку. Кодировка не может быть ASCII, если у вас есть отрицательные значения. Как только вы это выясните, вы можете преобразовать набор байтов в строку, используя:
Есть куча кодировок , которые можно использовать, посмотрите на класс Charset в Javadocs Sun .
источник
UTF-8
?String str = new String(bytes, java.nio.charset.StandardCharsets.ISO_8859_1);
«Правильное преобразование» между
byte[]
иString
заключается в явном указании кодировки, которую вы хотите использовать. Если вы начинаете сbyte[]
и на самом деле не содержат текстовые данные, там нет «надлежащего преобразования».String
Они предназначены для текста,byte[]
для двоичных данных, и единственное, что действительно разумно сделать, - это избегать конвертации между ними, если только вам это не нужно.Если вам действительно нужно использовать
String
двоичные данные для хранения, то самый безопасный способ - использовать кодировку Base64 .источник
Основная проблема (я думаю) в том, что вы невольно используете набор символов, для которого:
в некоторых случаях. UTF-8 является примером такого набора символов. В частности, определенные последовательности байтов не являются допустимыми кодировками в UTF-8. Если декодер UTF-8 встречает одну из этих последовательностей, он может отбросить ошибочные байты или декодировать их как кодовую точку Unicode для «нет такого символа». Естественно, когда вы затем попытаетесь закодировать символы в байтах, результат будет другим.
Решение:
String.toByteArray
метод String с явным набором символов.источник
Нам просто нужно создать новый
String
с помощью массива: http://www.mkyong.com/java/how-do-convert-byte-array-to-string-in-java/Байты получаемой строки различаются в зависимости от того, какую кодировку вы используете. new String (bytes) и new String (bytes, Charset.forName ("utf-8")) и new String (bytes, Charset.forName ("utf-16")) будут иметь разные байтовые массивы при вызове String # getBytes () (в зависимости от кодировки по умолчанию)
источник
new String(bytes)
иnew String(bytes, Charset.forName("utf-8"))
иnew String(bytes, Charset.forName("utf-16"))
все будут иметь разные байтовые массивы при вызовеString#getBytes()
(в зависимости от кодировки по умолчанию)char
С (и , таким образом текст , отображаемый) полученныхString
отличается при декодировании по-bytes
разному. Преобразование обратно в байты с использованием кодировки по умолчанию (используйтеString#getBytes("charset")
для указания иного) обязательно будет отличаться, поскольку оно преобразует разные входные данные. Строки не хранят то, из чегоbyte[]
они были сделаны,char
у них нет кодировки, иString
она не хранит это иначе.Использование
new String(byOriginal)
и преобразование обратно вbyte[]
использованиеgetBytes()
не гарантирует двухbyte[]
одинаковых значений. Это связано с вызовом ,StringCoding.encode(..)
который будет кодироватьString
вCharset.defaultCharset()
. Во время этой кодировки кодировщик может заменить неизвестные символы и внести другие изменения. Следовательно, использованиеString.getBytes()
может не вернуть равный массив, который вы изначально передали конструктору.источник
Почему была проблема: Как кто-то уже указал: если вы начинаете с байта [], и он на самом деле не содержит текстовых данных, «правильного преобразования» не существует. Строки предназначены для текста, byte [] - для двоичных данных, и единственное, что действительно разумно сделать, - это избегать преобразования между ними, если в этом нет необходимости.
Я наблюдал эту проблему, когда пытался создать byte [] из PDF-файла, затем преобразовать его в String, а затем взять String в качестве входных данных и преобразовать обратно в файл.
Поэтому убедитесь, что ваша логика кодирования и декодирования такая же, как у меня. Я явно закодировал byte [] в Base64 и расшифровал его, чтобы снова создать файл.
Использование регистра: Из - за некоторых ограничений я пытался отправить
byte[]
вrequest(POST)
и процесс следующим образом :Файл PDF >> Base64.encodeBase64 (byte []) >> String >> Отправить в запросе (POST) >> получить строку >> Base64.decodeBase64 (byte []) >> создать двоичный файл
Попробуйте это, и это сработало для меня ..
источник
Это прекрасно работает для меня:
Преобразование из строки в байт []:
Преобразование из байта [] в строку:
источник
источник
Я заметил что-то, чего нет ни в одном из ответов. Вы можете преобразовать каждый из байтов в массиве байтов в символы и поместить их в массив символов. Тогда строка
где cbuf это массив символов. Чтобы выполнить обратное преобразование, переберите строку, преобразующую каждый из символов в байты для помещения в байтовый массив, и этот байтовый массив будет таким же, как и первый.источник
javax.xml.bind.DatatypeConverter
следует сделать это:источник
Вот несколько методов, которые преобразуют массив байтов в строку. Я проверил их, они работают хорошо.
источник
Даже если
правильно он выдает,
UnsupportedEncodingException
что заставляет вас иметь дело с проверенным исключением. Вы можете использовать в качестве альтернативы другой конструктор, начиная с Java 1.6, для преобразования байтового массива вString
:Этот не бросает никаких исключений.
Конвертировать обратно также следует с помощью
StandardCharsets.UTF_8
:Опять же, вам не нужно иметь дело с проверенными исключениями.
источник
Мне удалось преобразовать байтовый массив в строку с помощью этого метода:
источник
Несмотря на то, что кодировка base64 безопасна и можно утверждать «правильный ответ», я прибыл сюда в поисках способа преобразования байтового массива Java в / из строки Java как есть. То есть, где каждый член байтового массива остается неизменным в своем аналоге String, при этом для кодирования / транспорта не требуется дополнительного места.
Этот ответ, описывающий 8-битные прозрачные кодировки, был очень полезен для меня. Я использовал
ISO-8859-1
терабайты двоичных данных для успешного преобразования туда и обратно (двоичная <-> строка) без раздуваемых требований к пространству, необходимых для кодирования base64, поэтому безопасен для моего варианта использования - YMMV.Это также помогло объяснить, когда / если вы должны экспериментировать.
источник
источник
Здесь рабочий код.
источник
Попробуйте указать 8-битную кодировку в обоих преобразованиях. ISO-8859-1, например.
источник
Считайте байты от
String
использованияByteArrayInputStream
и оберните их,BufferedReader
используя Char Char вместо Byte Stream, который преобразует байтовые данные в String.Выход:
источник
Вы можете использовать простой цикл for для преобразования:
источник
источник
Строка представляет собой набор символов (16-битный без знака). Так что если вы собираетесь конвертировать отрицательные числа в строку, они будут потеряны при переводе.
источник
источник
Используйте Base64 и решите вашу проблему. Слишком много в использовании. http://iharder.sourceforge.net/current/java/base64/
источник