Java Массив байтов к строке к массиву байтов

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

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

Arrays.toString(data.toByteArray())

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

[B@405217f8

Отправить (Это результат 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]

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

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

[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

Оба этих варианта отличаются от моих отправленных данных... Я'уверен, что я упускаю что-то действительно простое....

Есть помощь?!

Решение

Вы не можете просто взять возвращаемую строку и построить из нее строку... это'уже не тип данных 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
Комментарии (4)
String coolString = "cool string";

byte[] byteArray = coolString.getBytes();

String reconstitutedString = new String(byteArray);

System.out.println(reconstitutedString);

Что выходы на "холодный строку" на консоли.

Это'ы довольно легко.

Комментарии (9)

Что я сделал:

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

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== 
Комментарии (0)

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

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

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

Комментарии (0)

Его простым для преобразования массива байтов в строку и строку в байтовый массив в 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

Комментарии (1)

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

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

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

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

Комментарии (0)

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

Комментарии (2)

[JDK8]

import java.util.Base64;

В строку:

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

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

byte[] bytes = Base64.getDecoder().decode("JVBERi0xLjQKMyAwIG9iago8P...");
Комментарии (0)

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

Комментарии (0)

[На 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);
Комментарии (0)

Используйте ниже API кода, чтобы преобразовать байт-код как строку в байтовый массив.

 byte[] byteArray = DatatypeConverter.parseBase64Binary("JVBERi0xLjQKMyAwIG9iago8P...");
Комментарии (0)