it-roy-ru.com

Java Byte Array to String to Byte Array

Я пытаюсь понять byte [] в строку, строковое представление преобразования byte [] в byte [] ... Я конвертирую свой byte [] в строку для отправки, затем я ожидаю, что мой веб-сервис (написанный на 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]

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

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

[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]

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

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

169
0909EM

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

255
Yanick Rochon
String coolString = "cool string";

byte[] byteArray = coolString.getBytes();

String reconstitutedString = new String(byteArray);

System.out.println(reconstitutedString);

Это выводит «классную строку» на консоль.

Это чертовски легко.

126
CorayThan

Что я сделал:

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

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== 
20
Neeson.Z

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

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

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

7
Kal

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

5
user3469161

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

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

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

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

3
fuzzyBSc

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

2
JAB

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

1
Martin

[JDK8]

import Java.util.Base64;

Нанизывать:

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

К байтовому массиву:

byte[] bytes = Base64.getDecoder().decode("JVBERi0xLjQKMyAwIG9iago8P...");
1
Patricio Córdova

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

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

[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
trouble