online - Java Byte Array a String to Byte Array
tamaño de un string en bytes (10)
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 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()
.
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.
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
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.
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==
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<len; i++) {
bytes[i] = Byte.parseByte(byteValues[i].trim());
}
String str = new String(bytes);
** 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.
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.
Use la API de código a continuación para convertir el bytecode como cadena en Byte array.
byte[] byteArray = DatatypeConverter.parseBase64Binary("JVBERi0xLjQKMyAwIG9iago8P...");
[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...");
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.