Java Byte Array a String to Byte Array

Estoy tratando de entender un byte [] a cadena, representación de cadena de byte [] a byte [] conversión … Convierto mi byte [] a una cadena para enviar, entonces espero mi servicio web (escrito en python) 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 python, el servidor python devuelve una cadena a la persona que llama (que puedo ver es la misma 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 puede 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 imaginar 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 a mis datos enviados … Estoy seguro de que me estoy perdiendo algo realmente simple …

¡¿Alguna ayuda?!

No puede simplemente tomar la cadena devuelta y construir una cadena a partir de ella … ya no es un tipo de datos byte[] , ya es una cadena; necesitas analizarlo Por ejemplo :

 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 

** EDIT **

Obtendrá un indicio de su problema en su pregunta, donde diga " Whatever I seem to try I end up getting a byte array which looks as follows... [91, 45, ... ", porque 91 es el valor byte para [ , entonces [91, 45, ... es la matriz de bytes de la cadena " [-45, 1, 16, ... "].

El método Arrays.toString() devolverá una representación de String de la matriz especificada; lo que significa que el valor devuelto ya no será una matriz. Por ejemplo :

 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"; 

Como puede ver, s1 contiene la representación de cadena de la matriz b1 , mientras que s2 contiene la representación de cadena de los bytes contenidos en b1 .

Ahora, en su problema, su servidor devuelve una cadena similar a s1 , por lo tanto, para recuperar la representación de matriz, necesita el método constructor opuesto. Si s2.getBytes() es lo contrario de la new String(b1) , necesita encontrar lo opuesto a Arrays.toString(b1) , por lo tanto, el código que pegué en el primer fragmento de esta respuesta.

 String coolString = "cool string"; byte[] byteArray = coolString.getBytes(); String reconstitutedString = new String(byteArray); System.out.println(reconstitutedString); 

Eso produce una “secuencia genial” para la consola.

Es bastante fácil.

Lo que hice:

regresar a los clientes:

 byte[] result = ****encrypted data****; String str = Base64.encodeBase64String(result); return str; 

recibir de clientes:

  byte[] bytes = Base64.decodeBase64(str); 

sus datos serán transferidos en este formato:

 OpfyN9paAouZ2Pw+gDgGsDWzjIphmaZbUyFx5oRIN1kkQ1tDbgoi84dRfklf1OZVdpAV7TonlTDHBOr93EXIEBoY1vuQnKXaG+CJyIfrCWbEENJ0gOVBr9W3OlFcGsZW5Cf9uirSmx/JLLxTrejZzbgq3lpToYc3vkyPy5Y/oFWYljy/3OcC/S458uZFOc/FfDqWGtT9pTUdxLDOwQ6EMe0oJBlMXm8J2tGnRja4F/aVHfQddha2nUMi6zlvAm8i9KnsWmQG//ok25EHDbrFBP2Ia/6Bx/SGS4skk/0couKwcPVXtTq8qpNh/aYK1mclg7TBKHfF+DHppwd30VULpA== 

Lo que hace Arrays.toString() es crear una representación de cadena de cada byte individual en su ByteArray.

Por favor, compruebe la documentación API Arrays API

Para convertir su cadena de respuesta a la matriz de bytes original, debe usar split(",") o algo así y convertirlo en una colección y luego convertir cada elemento individual allí en un byte para recrear su matriz de bytes.

Es simple convertir una matriz de bytes a una cadena y una cadena de regreso a una matriz de bytes en java. necesitamos saber cuándo usar ‘nuevo’ de la manera correcta. Se puede hacer de la siguiente manera:

matriz de bytes para la conversión de cadenas:

 byte[] bytes = initializeByteArray(); String str = new String(bytes); 

Conversión de matrices de cadenas a bytes:

 String str = "Hello" byte[] bytes = str.getBytes(); 

Para obtener más detalles, consulte: http://evverythingatonce.blogspot.in/2014/01/tech-talkbyte-array-and-string.html

El tipo de salida que está viendo desde su matriz de bytes ( [B@405217f8 ) es también una salida para una matriz de bytes de longitud cero (es decir, un new 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 del método toString() de una colección regular.

Al igual que con otros encuestados, le señalaría los constructores de String que aceptan un parámetro byte[] para construir una cadena a partir del contenido de una matriz de bytes. Debería poder leer los bytes sin procesar del InputStream de un socket si desea obtener bytes a partir de una conexión TCP.

Si ya ha leído esos bytes como String (utilizando un InputStreamReader ), entonces, la cadena se puede convertir a bytes utilizando la función getBytes() . Asegúrese de pasar su conjunto de caracteres deseado a las funciones constructor de cadenas y getBytes() , y esto solo funcionará si el InputStreamReader puede convertir los datos de bytes en caracteres.

Si desea tratar con bytes sin procesar, realmente debe evitar el uso de esta capa de lectura de flujo.

¿No puedes simplemente enviar los bytes como bytes o convertir cada byte a un personaje y enviarlo como una cadena? Hacerlo como lo hace tomará un mínimo de 85 caracteres en la cadena, cuando solo tiene 11 bytes para enviar. Podría crear una representación de cadena de los bytes, por lo que sería “[B @ 405217f8”, que se puede convertir fácilmente en un objeto bytes o bytearray en Python. De lo contrario, podría representarlos como una serie de dígitos hexadecimales (“5b42403430353231376638”) ocupando 22 caracteres, que podrían decodificarse fácilmente en el lado de Python utilizando binascii.unhexlify() .

Si desea convertir la cadena nuevamente en una matriz de bytes, necesitará usar String.getBytes() (o la función equivalente de Python) y esto le permitirá imprimir la matriz de bytes original.

[JDK8]

 import java.util.Base64; 

Encadenar:

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

Para hacer byte array:

 byte[] bytes = Base64.getDecoder().decode("JVBERi0xLjQKMyAwIG9iago8P..."); 

Use la API de código a continuación para convertir el bytecode como cadena en Byte array.

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

[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);