Estoy tratando de entender un byte [] a cadena, representación de cadena de conversión de byte [] a byte [] ... Convierto mi byte [] a una cadena para enviar, luego espero mi servicio web (escrito en python) para hacer eco de los datos directamente al cliente.
Cuando envío los datos desde mi aplicación Java ...
Arrays.toString(data.toByteArray())
Bytes para enviar ..
[B@405217f8
Enviar (Este es el resultado de Arrays.toString () que debería ser una representación de cadena de mis datos de bytes, estos datos se enviarán a través del cable):
[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]
En el lado de Python, el servidor Python devuelve una cadena a la persona que llama (que puedo ver es la misma que la cadena que envié al servidor
[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]
El servidor debe devolver estos datos al cliente, donde se pueden verificar.
La respuesta que recibe mi cliente (como una cadena) se ve como
[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]
Parece que no puedo entender cómo recuperar la cadena recibida en un byte []
Lo que sea que intente, termino obteniendo una matriz de bytes que se ve de la siguiente manera ...
[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]
o puedo obtener una representación de bytes que es la siguiente:
B@2a80d889
Ambos son diferentes de mis datos enviados ... Estoy seguro de que me falta algo realmente simple ...
¡¿Alguna ayuda?!
response
en mi respuesta, entonces desafortunadamente no, no hay otra manera. La mejor manera sería que recibas los bytes como datos sin procesar (como binarios) en lugar de una cadena, o tal vez incluso como una cadena Base64, lo que solo requeriría que lo vuelvas a convertir como un valor base 256 (binario).Eso genera "cadena genial" a la consola.
Es bastante fácil.
fuente
byte[]
que está recibiendo se representa como aString
; es decir,"[97, 98, 99]"
no[97, 98, 99]
. Es decir, su respuesta ni siquiera se aplica a esta situación.String
quebyte[]
aString
. Creo que la pregunta es requisitobyte[]
paraString
abyte[]
.Lo que hice:
volver a los clientes:
recibir de los clientes:
sus datos serán transferidos en este formato:
fuente
Lo que
Arrays.toString()
hace es crear una representación de cadena de cada byte individual en su byteArray.Por favor, consulte la documentación de la API Arrays API
Para convertir su cadena de respuesta de nuevo a la matriz de bytes original, debe usar
split(",")
o algo así y convertirla en una colección y luego convertir cada elemento individual allí en un byte para recrear su matriz de bytes.fuente
Es simple convertir la matriz de bytes en una cadena y volver a la cadena de bytes en Java. Necesitamos saber cuándo usar 'nuevo' de la manera correcta. Se puede hacer de la siguiente manera:
conversión de matriz de bytes a cadena:
Cadena de conversión de matriz de bytes:
Para obtener más detalles, consulte: http://evverythingatonce.blogspot.in/2014/01/tech-talkbyte-array-and-string.html
fuente
El tipo de salida que está viendo desde su matriz de bytes (
[B@405217f8
) también es una salida para una matriz de bytes de longitud cero (es decirnew byte[0]
). Parece que esta cadena es una referencia a la matriz en lugar de una descripción de los contenidos de la matriz como podríamos esperar de untoString()
método de colección regular .Al igual que con otros encuestados, le diría a los
String
constructores que aceptan unbyte[]
parámetro para construir una cadena a partir del contenido de una matriz de bytes. Debería poder leer bytes sin procesar de un socketInputStream
si desea obtener bytes de una conexión TCP.Si ya ha leído esos bytes como a
String
(usando unInputStreamReader
), entonces, la cadena se puede convertir a bytes usando lagetBytes()
función. Asegúrese de pasar el conjunto de caracteres deseado tanto al constructor de cadena como a lasgetBytes()
funciones, y esto solo funcionará si los datos de bytes pueden convertirse en caracteres mediante elInputStreamReader
.Si desea lidiar con bytes sin procesar, realmente debe evitar usar esta capa de lector de flujo.
fuente
¿No puede simplemente enviar los bytes como bytes o convertir cada byte en un carácter y enviarlo como una cadena? Hacerlo como está ocupará un mínimo de 85 caracteres en la cadena, cuando solo tiene 11 bytes para enviar. Se puede crear una representación de cadena de los bytes, por lo que sería "[B @ 405217f8", que puede ser fácilmente convertida en una
bytes
obytearray
objeto en Python. De lo contrario, podría representarlos como una serie de dígitos hexadecimales ("5b42403430353231376638") que ocupan 22 caracteres, que podrían decodificarse fácilmente en el lado de Pythonbinascii.unhexlify()
.fuente
[B@405217f8
es el ID de objeto Java de la matriz, no el contenido de la matriz. La identificación del objeto ciertamente no puede "convertirse fácilmente en un objeto bytes o bytearray en python". Lo mejor que puede hacer en cuanto al tamaño es convertir el byte [] en una cadena base64.[JDK8]
Encadenar:
Para la matriz de bytes:
fuente
Si desea convertir la cadena de nuevo en una matriz de bytes, deberá usarla
String.getBytes()
(o una función equivalente de Python) y esto le permitirá imprimir la matriz de bytes original.fuente
Use la siguiente API de código para convertir bytecode como cadena a Byte array.
fuente
[JAVA 8]
fuente