web-dev-qa-db-fra.com

Tableau d'octets Java à chaîne en tableau d'octets

J'essaie de comprendre une conversion d'octet à chaîne, une représentation de chaîne d'octet [] en conversion d'octet [...]. Je convertis mon octet [] en chaîne à envoyer. renvoyer les données directement au client.

Quand j'envoie les données de mon application Java ...

Arrays.toString(data.toByteArray())

Octets à envoyer .. 

[B@405217f8

Send (Ceci est le résultat de Arrays.toString () qui devrait être une représentation sous forme de chaîne de mes données d'octet. Ces données seront envoyées sur le réseau): 

[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]

Du côté de python, le serveur python renvoie une chaîne à l'appelant (celle-ci est identique à la chaîne que j'ai envoyée au serveur.

[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]

Le serveur doit renvoyer ces données au client, où elles peuvent être vérifiées. 

La réponse que mon client reçoit (sous forme de chaîne) ressemble à

[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]

Je n'arrive pas à comprendre comment récupérer la chaîne reçue dans un octet []

Quoi que je semble essayer, je finis par avoir un tableau d'octets qui ressemble à ceci ...

[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]

ou je peux obtenir une représentation d'octet qui est la suivante:

B@2a80d889

Les deux sont différents de mes données envoyées ... Je suis sûr que je manque quelque chose de vraiment simple .... 

De l'aide?!

169
0909EM

Vous ne pouvez pas simplement prendre la chaîne retournée et en construire une chaîne ... ce n'est plus un type de données byte[], c'est déjà une chaîne; vous devez l'analyser. Par exemple :

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

** MODIFIER **

Vous avez une indication de votre problème dans votre question, où vous dites "Whatever I seem to try I end up getting a byte array which looks as follows... [91, 45, ...", car 91 est la valeur d'octet pour [, donc [91, 45, ... est le tableau d'octets de la chaîne "[-45, 1, 16, ...".

La méthode Arrays.toString() renverra une représentation String du tableau spécifié; ce qui signifie que la valeur renvoyée ne sera plus un tableau. Par exemple :

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

Comme vous pouvez le constater, s1 contient la représentation sous forme de chaîne du tableau b1, tandis que s2 contient la représentation sous forme de chaîne du octets contenu dans b1.

Désormais, dans votre problème, votre serveur renvoie une chaîne similaire à s1. Par conséquent, pour obtenir la représentation de tableau, vous avez besoin de la méthode du constructeur opposé. Si s2.getBytes() est le contraire de new String(b1), vous devez trouver le contraire de Arrays.toString(b1), ainsi le code que j'ai collé dans le premier extrait de cette réponse.

255
Yanick Rochon
String coolString = "cool string";

byte[] byteArray = coolString.getBytes();

String reconstitutedString = new String(byteArray);

System.out.println(reconstitutedString);

Cela envoie "chaîne cool" à la console.

C'est sacrément facile.

126
CorayThan

Ce que j'ai fait:

retour aux clients:

byte[] result = ****encrypted data****;

String str = Base64.encodeBase64String(result);

return str;

recevoir des clients:

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

vos données seront transférées dans ce format:

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

Arrays.toString() crée une représentation sous forme de chaîne de chaque octet individuel dans votre tableau d'octets.

Veuillez consulter la documentation de l'API API de tableaux

Pour reconvertir votre chaîne de réponse en tableau d'octets d'origine, vous devez utiliser split(",") ou quelque chose de ce type, la convertir en une collection, puis convertir chaque élément individuel en octet pour recréer votre tableau d'octets.

7
Kal

Il est simple de convertir un tableau d'octets en chaîne et une chaîne de caractères en tableau d'octets en Java. nous devons savoir quand utiliser «nouveau» de la bonne manière. Cela peut être fait comme suit:

conversion d'octets en chaînes:

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

Conversion de tableau en octets:

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

Pour plus de détails, consultez: http://evverythingatonce.blogspot.in/2014/01/tech-talkbyte-array-and-string.html

5
user3469161

Le type de sortie que vous voyez dans votre tableau d'octets ([B@405217f8) est également une sortie pour un tableau d'octets de longueur nulle (c'est-à-dire new byte[0]). Il semble que cette chaîne soit une référence au tableau plutôt qu'une description du contenu du tableau, comme on pourrait s'y attendre de la méthode toString() d'une collection régulière.

Comme pour les autres répondants, je vous indiquerais les constructeurs String qui acceptent un paramètre byte[] pour construire une chaîne à partir du contenu d'un tableau d'octets. Vous devriez pouvoir lire des octets bruts à partir de la variable InputStream d'un socket si vous souhaitez obtenir des octets à partir d'une connexion TCP. 

Si vous avez déjà lu ces octets sous la forme d'une String (à l'aide d'une InputStreamReader), la chaîne peut être convertie en octets à l'aide de la fonction getBytes(). Assurez-vous de transmettre le jeu de caractères souhaité aux fonctions constructeur de chaîne et getBytes(). Cela ne fonctionnera que si les données d'octet peuvent être converties en caractères par la variable InputStreamReader

Si vous voulez traiter des octets bruts, vous devriez vraiment éviter d'utiliser cette couche de lecteur de flux.

3
fuzzyBSc

Ne pouvez-vous pas simplement envoyer les octets sous forme d'octets ou convertir chaque octet en un caractère et l'envoyer sous forme de chaîne? Si vous le faites comme vous l'êtes, il faut au moins 85 caractères dans la chaîne, alors que vous ne disposez que de 11 octets à envoyer. Vous pouvez créer une représentation sous forme de chaîne des octets. Il s'agirait donc de "[B @ 405217f8", qui peut facilement être converti en objet bytes ou bytearray en Python. À défaut, vous pourriez les représenter sous la forme d'une série de chiffres hexadécimaux ("5b42403430353231376638") contenant 22 caractères pouvant être facilement décodés côté Python à l'aide de binascii.unhexlify() .

2
JAB

Si vous voulez reconvertir la chaîne en un tableau d'octets, vous devrez utiliser String.getBytes() (ou une fonction Python équivalente) et cela vous permettra d'imprimer le tableau d'octets d'origine.

1
Martin

[JDK8]

import Java.util.Base64;

Pour ficeler:

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

Pour octet tableau:

byte[] bytes = Base64.getDecoder().decode("JVBERi0xLjQKMyAwIG9iago8P...");
1
Patricio Córdova

Utilisez l'API de code ci-dessous pour convertir le bytecode sous forme de chaîne en tableau Byte.

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

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