Как преобразовать байтовый массив в строку и наоборот? - PullRequest
211 голосов
/ 08 октября 2009

Я должен преобразовать байтовый массив в строку в 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);

Я застрял в этой проблеме.

Ответы [ 23 ]

2 голосов
/ 08 января 2016

javax.xml.bind.DatatypeConverter должен сделать это:

byte [] b = javax.xml.bind.DatatypeConverter.parseHexBinary("E62DB");
String s = javax.xml.bind.DatatypeConverter.printHexBinary(b);
1 голос
/ 21 января 2019

Даже если

new String(bytes, "UTF-8")

правильно, выдает UnsupportedEncodingException, что заставляет вас иметь дело с проверенным исключением. Вы можете использовать в качестве альтернативы другой конструктор начиная с Java 1.6 для преобразования байтового массива в String:

new String(bytes, StandardCharsets.UTF_8)

Это не исключение.

Обратное преобразование также следует выполнить с помощью StandardCharsets.UTF_8:

"test".getBytes(StandardCharsets.UTF_8)

Опять же, вам не нужно иметь дело с проверенными исключениями.

1 голос
/ 22 октября 2016

Мне удалось преобразовать массив байтов в строку с помощью этого метода:

public static String byteArrayToString(byte[] data){
    String response = Arrays.toString(data);

    String[] byteValues = response.substring(1, response.length() - 1).split(",");
    byte[] bytes = new byte[byteValues.length];

    for (int i=0, len=bytes.length; i<len; i++) {
        bytes[i] = Byte.parseByte(byteValues[i].trim());
    }

    String str = new String(bytes);
    return str.toLowerCase();
}
1 голос
/ 28 декабря 2017

Хотя base64-кодирование безопасно и можно утверждать «правильный ответ», я прибыл сюда в поисках способа преобразования байтового массива Java в / из строки Java как есть. То есть, где каждый член байтового массива остается неизменным в своем аналоге String, при этом для кодирования / транспорта не требуется дополнительного пространства.

Этот ответ , описывающий 8-битные прозрачные кодировки, был очень полезен для меня. Я использовал ISO-8859-1 на терабайтах двоичных данных для успешного преобразования туда и обратно (двоичная <-> строка) без раздуваемых требований к пространству, необходимых для кодирования base64, поэтому безопасен для моего варианта использования - YMMV.

Это также помогло при объяснении, когда / если вам следует экспериментировать.

0 голосов
/ 08 октября 2009

Строка - это набор символов (16-битный без знака). Поэтому, если вы собираетесь конвертировать отрицательные числа в строку, они будут потеряны при переводе.

0 голосов
/ 04 апреля 2018

Вы можете использовать простой цикл for для преобразования:

public void byteArrToString(){
   byte[] b = {'a','b','$'};
   String str = ""; 
   for(int i=0; i<b.length; i++){
       char c = (char) b[i];
       str+=c;
   }
   System.out.println(str);
}
0 голосов
/ 31 октября 2017
InputStream is = new FileInputStream("/home/kalt/Desktop/SUDIS/READY/ds.bin");
byte[] bytes = IOUtils.toByteArray(is);
0 голосов
/ 14 августа 2017

Вот рабочий код.

            // Encode byte array into string . TemplateBuffer1 is my bytearry variable.

        String finger_buffer = Base64.encodeToString(templateBuffer1, Base64.DEFAULT);
        Log.d(TAG, "Captured biometric device->" + finger_buffer);


        // Decode String into Byte Array. decodedString is my bytearray[] 
        decodedString = Base64.decode(finger_buffer, Base64.DEFAULT);
0 голосов
/ 08 мая 2012

Используйте Base64 и решите вашу проблему. Его слишком много в использовании. http://iharder.sourceforge.net/current/java/base64/

0 голосов
/ 05 июня 2014
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;    

private static String base64Encode(byte[] bytes)
{
    return new BASE64Encoder().encode(bytes);
}

private static byte[] base64Decode(String s) throws IOException
{
    return new BASE64Decoder().decodeBuffer(s);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...