Байт Java-массива с массивом строк в байт

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

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

Arrays.toString(data.toByteArray())

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

[[email protected]

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

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

[email protected]

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

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

Ответ 1

Вы не можете просто взять возвращенную строку и построить из нее строку... это больше не тип данных 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);

** EDIT **

Вы получите подсказку о своей проблеме в своем вопросе, где вы говорите "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), таким образом, код, который был вставлен в первый фрагмент этого ответа.

Ответ 2

String coolString = "cool string";

byte[] byteArray = coolString.getBytes();

String reconstitutedString = new String(byteArray);

System.out.println(reconstitutedString);

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

Это довольно прост.

Ответ 3

Что я сделал:

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

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== 

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

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

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

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

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

Ответ 7

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

Ответ 8

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

Ответ 9

[JDK8]

import java.util.Base64;

В строку:

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

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

byte[] bytes = Base64.getDecoder().decode("JVBERi0xLjQKMyAwIG9iago8P...");

Ответ 10

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

 byte[] byteArray = DatatypeConverter.parseBase64Binary("JVBERi0xLjQKMyAwIG9iago8P...");