Я'пытаюсь понять преобразование байта[] в строку, строковое представление байта[] в байт[]... Я конвертирую байт[] в строку для отправки, затем ожидаю, что мой веб-сервис (написанный на 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<len; i++) {
bytes[i] = Byte.parseByte(byteValues[i].trim());
}
String str = new String(bytes);
EDIT
Намек на вашу проблему содержится в вашем вопросе, где вы говорите "Что бы я ни пробовал, в итоге я получаю массив байтов, который выглядит следующим образом... [91, 45, ...
", потому что 91
является значением байта для [
, поэтому [91, 45, ...
является байтовым массивом строки "[-45, 1, 16, ...
".
Метод Arrays.toString()
вернет строковое
представление указанного массива; это означает, что возвращаемое значение уже не будет массивом. Например
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)
, таким образом, код, который я вставил в первый фрагмент этого ответа.
String coolString = "cool string";
byte[] byteArray = coolString.getBytes();
String reconstitutedString = new String(byteArray);
System.out.println(reconstitutedString);
Что выходы на "холодный строку" на консоли.
Это'ы довольно легко.
Что я сделал:
возврат клиентам:
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==
Что делает Arrays.toString()
, так это создает строковое представление каждого отдельного байта в вашем массиве byteArray.
Пожалуйста, ознакомьтесь с документацией по API API Arrays
Чтобы преобразовать строку ответа обратно в исходный массив байтов, вам нужно использовать split(",")
или что-то подобное и преобразовать ее в коллекцию, а затем преобразовать каждый отдельный элемент в байт, чтобы воссоздать массив байтов.
Его простым для преобразования массива байтов в строку и строку в байтовый массив в 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
Какой выход вы видите из своего байтовый массив ([Б@405217f8
) является также выход на нулевой байт длины массива (т. е. новый байт[0]
). Похоже, что эта строка является ссылкой на массив, а не описание содержимого массива, как мы могли бы ожидать от обычного коллекция'ы метод toString()
метод.
Как и другие респонденты, я хотел бы указать вам на "строка" конструкторы, которые принимают байтов в параметре [] создать строку из содержимого байтового массива. Вы должны быть в состоянии прочитать необработанные байты из сокета'класса InputStream ы `если вы хотите получить байт из соединения TCP.
Если вы уже читали эти байты в строку (с помощью InputStreamReader
), тогда строки могут быть преобразованы в байты, используя этот метод getbytes (функция). Будьте уверены, чтобы пройти в нужный набор символов и строку конструктор и метод getbytes (функции), и это будет работать только если байт данных могут быть преобразованы в символы
InputStreamReader`.
Если вы хотите иметь дело с сырыми байтами вы действительно должны избегать использования этого слоя читателя поток.
Не можете ли вы просто отправить байты как байты или преобразовать каждый байт в символ и отправить как строку? Если делать это так, как вы делаете, то строка займет как минимум 85 символов, в то время как вам нужно отправить только 11 байт. Вы можете создать строковое представление байтов, так что это будет "[B@405217f8", которое может быть легко преобразовано в объект bytes
или bytearray
в Python. В противном случае можно представить их в виде серии шестнадцатеричных цифр ("5b42403430353231376638"), занимающих 22 символа, которые можно легко расшифровать на стороне Python с помощью binascii.unhexlify()
.
[JDK8]
import java.util.Base64;
В строку:
String str = Base64.getEncoder().encode(new byte[]{ -47, 1, 16, ... });
В байтовый массив:
byte[] bytes = Base64.getDecoder().decode("JVBERi0xLjQKMyAwIG9iago8P...");
Используйте ниже API кода, чтобы преобразовать байт-код как строку в байтовый массив.
byte[] byteArray = DatatypeConverter.parseBase64Binary("JVBERi0xLjQKMyAwIG9iago8P...");