Java Byte Array to String to Byte Array - PullRequest
       118

Java Byte Array to String to Byte Array

171 голосов
/ 13 июля 2011

Я пытаюсь понять преобразование байта [] в строку, строковое представление преобразования байта [] в байт [] ... Я преобразовываю свой байт [] в строку для отправки, затем я ожидаю, что мой веб-сервис (записанв Python) для передачи данных прямо обратно клиенту.

Когда я отправляю данные из моего приложения Java ...

Arrays.toString(data.toByteArray())

Байт для отправки ..

[B@405217f8

Send (Это результат Arrays.toString (), который должен быть строковым представлением моих байтовых данных, эти данные будут отправлены по сети):

[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]

На стороне Pythonсервер python возвращает строку вызывающей стороне (я вижу, что она совпадает со строкой, которую я отправил на сервер

[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]

Сервер должен вернуть эти данные клиенту, где их можно проверить.

Ответ, который получает мой клиент (в виде строки), выглядит так:

[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]

Кажется, я не могу понять, как вернуть полученную строку обратно в байт []

Что бы я ни старался, я получаю байтовый массив, который выглядит следующим образомlows ...

[91, 45, 52, 55, 44, 32, 49, 44, 32, 49, 54, 44, 32, 56, 52, 44, 32, 50, 44, 32, 49, 48, 49, 44, 32, 49, 49, 48, 44, 32, 56, 51, 44, 32, 49, 49, 49, 44, 32, 49, 48, 57, 44, 32, 49, 48, 49, 44, 32, 51, 50, 44, 32, 55, 56, 44, 32, 55, 48, 44, 32, 54, 55, 44, 32, 51, 50, 44, 32, 54, 56, 44, 32, 57, 55, 44, 32, 49, 49, 54, 44, 32, 57, 55, 93]

или я могу получить байтовое представление, которое выглядит следующим образом:

B@2a80d889

Оба они отличаются от моих отправленных данных ... Я уверенМне не хватает чего-то по-настоящему простого ....

Любая помощь?!

Ответы [ 11 ]

260 голосов
/ 13 июля 2011

Вы не можете просто взять возвращенную строку и создать из нее строку ... это уже не тип данных byte[], это уже строка; Вы должны разобрать это. Например:

String response = "[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]";      // response from the Python script

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

** РЕДАКТИРОВАТЬ **

Вы получаете подсказку о своей проблеме в своем вопросе, где вы говорите "Whatever I seem to try I end up getting a byte array which looks as follows... [91, 45, ...", потому что 91 - это значение байта для [, поэтому [91, 45, ... - это байтовый массив строки "[-45, 1, 16, ... "строка.

Метод Arrays.toString() вернет String представление указанного массива; Это означает, что возвращаемое значение больше не будет массивом. Например:

byte[] b1 = new byte[] {97, 98, 99};

String s1 = Arrays.toString(b1);
String s2 = new String(b1);

System.out.println(s1);        // -> "[97, 98, 99]"
System.out.println(s2);        // -> "abc";

Как видите, s1 содержит строковое представление массива b1, в то время как s2 содержит строковое представление байтов , содержащееся в b1 .

Теперь, в вашей задаче, ваш сервер возвращает строку, аналогичную s1, поэтому, чтобы получить представление массива, вам нужен противоположный метод конструктора. Если s2.getBytes() противоположно new String(b1), вам нужно найти противоположность Arrays.toString(b1), поэтому код, который я вставил в первый фрагмент этого ответа.

127 голосов
/ 06 марта 2013
String coolString = "cool string";

byte[] byteArray = coolString.getBytes();

String reconstitutedString = new String(byteArray);

System.out.println(reconstitutedString);

Выводит "прикольную строку" на консоль.

Это чертовски просто.

21 голосов
/ 27 июня 2014

Что я сделал:

возврат клиентам:

byte[] result = ****encrypted data****;

String str = Base64.encodeBase64String(result);

return str;

получить от клиентов:

 byte[] bytes = Base64.decodeBase64(str);

Ваши данные будут переданы в следующем формате:

OpfyN9paAouZ2Pw+gDgGsDWzjIphmaZbUyFx5oRIN1kkQ1tDbgoi84dRfklf1OZVdpAV7TonlTDHBOr93EXIEBoY1vuQnKXaG+CJyIfrCWbEENJ0gOVBr9W3OlFcGsZW5Cf9uirSmx/JLLxTrejZzbgq3lpToYc3vkyPy5Y/oFWYljy/3OcC/S458uZFOc/FfDqWGtT9pTUdxLDOwQ6EMe0oJBlMXm8J2tGnRja4F/aVHfQddha2nUMi6zlvAm8i9KnsWmQG//ok25EHDbrFBP2Ia/6Bx/SGS4skk/0couKwcPVXtTq8qpNh/aYK1mclg7TBKHfF+DHppwd30VULpA== 
7 голосов
/ 13 июля 2011

Что делает Arrays.toString(), так это создает строковое представление каждого отдельного байта в вашем байтовом массиве.

Пожалуйста, проверьте документацию API API массивов

Чтобы преобразовать вашу строку ответа обратно в исходный байтовый массив, вы должны использовать split(",") или что-то еще и преобразовать его в коллекцию, а затем преобразовать каждый отдельный элемент в нем в байт, чтобы воссоздать ваш байтовый массив.

5 голосов
/ 27 марта 2014

Его просто конвертировать байтовый массив в строку и строку обратно в байтовый массив в Java. нам нужно знать, когда правильно использовать «новое». Это можно сделать следующим образом:

преобразование байтового массива в строку:

byte[] bytes = initializeByteArray();
String str = new String(bytes);

Преобразование строки в байтовый массив:

String str = "Hello"
byte[] bytes = str.getBytes();

Для получения более подробной информации смотрите: http://evverythingatonce.blogspot.in/2014/01/tech-talkbyte-array-and-string.html

3 голосов
/ 02 октября 2012

Тип вывода, который вы видите из вашего байтового массива ([B@405217f8), также является выходом для байтового массива нулевой длины (то есть new byte[0]).Похоже, что эта строка является ссылкой на массив, а не описанием содержимого массива, как мы могли бы ожидать от метода toString() обычной коллекции.

Как и в случае с другими респондентами, я бы указал наконструкторы String, которые принимают параметр byte[] для создания строки из содержимого байтового массива.Вы должны иметь возможность читать необработанные байты из сокета InputStream, если вы хотите получить байты из TCP-соединения.

Если вы уже прочитали эти байты как String (используя InputStreamReader), то строку можно преобразовать в байты с помощью функции getBytes().Обязательно передайте желаемый набор символов как конструктору String, так и функциям getBytes(), и это будет работать, только если байтовые данные могут быть преобразованы в символы с помощью InputStreamReader.

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

2 голосов
/ 27 июля 2016

[JDK8]

import java.util.Base64;

В строку:

String str = Base64.getEncoder().encode(new byte[]{ -47, 1, 16, ... });

В массив байтов:

byte[] bytes = Base64.getDecoder().decode("JVBERi0xLjQKMyAwIG9iago8P...");
2 голосов
/ 14 июля 2011

Можете ли вы не просто отправить байты как байты, или преобразовать каждый байт в символ и отправить как строку?Выполнение, как вы, займет не менее 85 символов в строке, когда у вас есть только 11 байтов для отправки.Вы можете создать строковое представление байтов, так что это будет «[B @ 405217f8», который можно легко преобразовать в объект bytes или bytearray в Python.В противном случае вы можете представить их в виде серии шестнадцатеричных цифр ("5b42403430353231376638"), занимающих 22 символа, которые можно легко декодировать на стороне Python, используя binascii.unhexlify().

1 голос
/ 14 июля 2011

Если вы хотите преобразовать строку обратно в байтовый массив, вам нужно будет использовать String.getBytes() (или эквивалентную функцию Python), и это позволит вам распечатать исходный байтовый массив.

0 голосов
/ 09 августа 2018

[JAVA 8]

import java.util.Base64;

String dummy= "dummy string";
byte[] byteArray = dummy.getBytes();

byte[] salt = new byte[]{ -47, 1, 16, ... }
String encoded = Base64.getEncoder().encodeToString(salt);
...