Байт 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...");