192 votes

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

J'essaie de comprendre un byte[] à la chaîne, chaîne représentation de byte[] byte[] la conversion... je convertir mon byte[] pour une chaîne de caractères à envoyer, puis je attendre de mon web service (écrit en python) l'écho des données directement vers le client.

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

Arrays.toString(data.toByteArray())

Octets à envoyer..

[B@405217f8

Envoyer (Ce qui est le résultat de Tableaux.toString() qui doit être une représentation de chaîne de mon octets de données, ces données seront envoyées sur le fil):

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

Sur le python côté, le python serveur retourne une chaîne de caractères à l'appelant (ce que je peux voir, c'est la même que la chaîne que j'ai envoyé 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 sur le client, où qu'il puisse être vérifié.

La réponse de mon client reçoit (comme une chaîne de caractères) 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 à trouver comment obtenir le reçu de la chaîne de retour dans un byte[]

Tout ce que je semble essayer je finis par obtenir un tableau d'octets qui se présente comme suit...

[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 un octet de la représentation, qui est comme suit:

B@2a80d889

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

Toute aide?!

284voto

Yanick Rochon Points 18537

Vous ne pouvez pas simplement prendre le chaîne retournée et construire une chaîne de... ce n'est pas un byte[] type de données de plus, c'est déjà une chaîne de caractères; vous avez besoin de 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.valueof(byteValues[i].trim());     
}

String str = new String(bytes);

** EDIT **

Vous obtenez un indice de votre problème à votre question, où vous dites:"Whatever I seem to try I end up getting a byte array which looks as follows... [91, 45, ...", parce qu' 91 est la valeur de l'octet pour [, alors [91, 45, ... est le tableau d'octets de la chaîne de caractères "[-45, 1, 16, ..." de la chaîne.

La méthode Arrays.toString() retournera String de la représentation de la matrice; ce qui signifie que la valeur retournée ne sera pas un tableau plus. 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 voir, s1 tient la corde de la représentation de la matrice b1, tandis que l' s2 détient la représentation de chaîne d' octets contenus dans b1.

Maintenant, dans votre problème, votre serveur renvoie une chaîne similaire à l' s1, par conséquent, pour obtenir la matrice de représentation en arrière, vous avez besoin en face de la méthode constructeur. Si s2.getBytes() est le contraire de l' new String(b1), vous devez savoir à l'opposé de Arrays.toString(b1), donc le code que j'ai collé dans le premier extrait de cette réponse.

139voto

CorayThan Points 2190
 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.

22voto

Z.Neeson Points 106

Ce que j'ai fait:

retourner 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== 
 

8voto

Kal Points 14230

Ce Arrays.toString() n'est de créer une représentation de chaîne de chaque octet dans votre byteArray.

Veuillez consulter la documentation de l'API Les tableaux de l'API

Pour convertir votre chaîne de réponse en arrière à l'original d'un tableau d'octets, vous devez utiliser split(",") ou quelque chose et de le convertir en une collection, puis de convertir chaque élément individuel, il y à un octet de recréer votre tableau d'octets.

3voto

fuzzyBSc Points 47

Le genre de sortie que vous voyez à partir de votre tableau d'octets ([B@405217f8) est également une sortie pour une longueur de zéro tableau d'octets (ie new byte[0]). Il ressemble à cette chaîne de caractères est une référence au tableau plutôt qu'une description du contenu de la matrice, comme on peut l'attendre d'une collecte régulière de l' toString() méthode.

Comme avec les autres participants, je voudrais vous à l' String constructeurs qui acceptent un byte[] paramètre pour construire une chaîne à partir du contenu d'un tableau d'octets. Vous devriez être en mesure de lire des octets brutes à partir d'une prise de InputStream si vous souhaitez obtenir des octets à partir d'une connexion TCP.

Si vous avez déjà lu ces octets en tant que String (à l'aide d'un InputStreamReader), alors, la chaîne peut être converti en d'octets à l'aide de l' getBytes() fonction. Assurez-vous de passer dans votre choix de jeu de caractères à la fois la Chaîne de constructeur et d' getBytes() fonctions, et cela ne fonctionne que si l'octet de données peuvent être convertis à des personnages par l' InputStreamReader.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X