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[]
, это уже строка; вам нужно разобрать ее. НапримерЧто выходы на "холодный строку" на консоли.
Это'ы довольно легко.
Что я сделал:
возврат клиентам:
получать от клиентов:
ваши данные будут переведены в этот формат:
Что делает
Arrays.toString()
, так это создает строковое представление каждого отдельного байта в вашем массиве byteArray.Пожалуйста, ознакомьтесь с документацией по API API Arrays
Чтобы преобразовать строку ответа обратно в исходный массив байтов, вам нужно использовать
split(",")
или что-то подобное и преобразовать ее в коллекцию, а затем преобразовать каждый отдельный элемент в байт, чтобы воссоздать массив байтов.Его простым для преобразования массива байтов в строку и строку в байтовый массив в Java. мы должны знать, когда использовать 'новый' в правильном направлении. Это можно сделать следующим образом:
байтовый массив для преобразования строк:
Строку байтов преобразования массива:
Для более подробной информации, посмотрите на: 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]
В строку:
В байтовый массив:
Если вы хотите преобразовать строку обратно в массив байтов, вам потребуется использовать строку.метод getbytes () (или эквивалент в Python функция), и это позволит вам распечатать исходный массив байтов.
[На Java 8]
Используйте ниже API кода, чтобы преобразовать байт-код как строку в байтовый массив.