Java-Byte-Array zum String-zu-Byte-Array

Ich versuche, ein Byte [] zu verstehen, string, String-Darstellung von Byte [] zu Byte [] Konvertierung … Ich konvertiere mein Byte [] in eine Zeichenfolge zu senden, erwarte ich dann meinen Web-Service (in Python geschrieben) um die Daten direkt an den Client zurückzusenden.

Wenn ich die Daten aus meiner Java-Anwendung sende …

Arrays.toString(data.toByteArray()) 

Bytes zu senden ..

 [B@405217f8 

Send (Dies ist das Ergebnis von Arrays.toString (), das eine String-Repräsentation meiner Byte-Daten sein sollte, diese Daten werden über die Leitung gesendet):

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

Auf der Python-Seite gibt der Python-Server eine Zeichenfolge an den Aufrufer zurück (die ich sehen kann, ist die gleiche wie die Zeichenfolge, die ich an den Server gesendet habe

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

Der Server sollte diese Daten an den Client zurückgeben, wo sie verifiziert werden können.

Die Antwort, die mein Client (als String) erhält, sieht folgendermaßen aus

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

Ich kann nicht herausfinden, wie ich die empfangene Zeichenfolge in ein Byte zurückbringen kann []

Was auch immer ich zu versuchen versuche, bekomme ich ein Byte-Array, das wie folgt aussieht …

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

oder ich kann eine Byte-Darstellung bekommen, die wie folgt aussieht:

 B@2a80d889 

Beide unterscheiden sich von meinen gesendeten Daten … Ich bin mir sicher, dass ich etwas wirklich Einfaches vermisse ….

Irgendeine Hilfe?!

   

Du kannst nicht einfach die zurückgegebene Zeichenkette nehmen und daraus eine Zeichenkette konstruieren … es ist kein byte[] Datentyp mehr, es ist bereits eine Zeichenkette; Sie müssen es analysieren. Beispielsweise :

 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 

** BEARBEITEN **

Du bekommst einen Hinweis auf dein Problem in deiner Frage, wo du sagst: " Whatever I seem to try I end up getting a byte array which looks as follows... [91, 45, ... bekomme ein Whatever I seem to try I end up getting a byte array which looks as follows... [91, 45, ... ], weil 91 der Byte-Wert ist für [ , so [91, 45, ... ist das Byte-Array der Zeichenfolge " [-45, 1, 16, ... " - Zeichenfolge.

Die Methode Arrays.toString() gibt eine String Repräsentation des angegebenen Arrays zurück; Das bedeutet, dass der zurückgegebene Wert kein Array mehr ist. Beispielsweise :

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

Wie Sie sehen können, enthält s1 die Zeichenfolgendarstellung des Arrays b1 , während s2 die Zeichenfolgendarstellung der in b1 enthaltenen Bytes enthält.

Nun gibt Ihr Server in Ihrem Problem eine Zeichenfolge zurück, die s1 ähnlich ist. Um die Array-Darstellung zurückzubekommen, benötigen Sie daher die entgegengesetzte Konstruktormethode. Wenn s2.getBytes() das Gegenteil von new String(b1) , müssen Sie das Gegenteil von Arrays.toString(b1) , also den Code, den ich in das erste Snippet dieser Antwort eingefügt habe.

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

Das gibt “cool string” an die Konsole aus.

Es ist verdammt leicht.

Was ich getan habe:

zurück zu den Kunden:

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

Erhalten von Kunden:

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

Ihre Daten werden in diesem Format übertragen:

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

Was Arrays.toString() , ist eine String-Repräsentation jedes einzelnen Bytes in Ihrem ByteArray.

Überprüfen Sie die API-Dokumentation Array-API

Um Ihre Antwort-Zeichenfolge zurück in das ursprüngliche Byte-Array zu konvertieren, müssen Sie split(",") oder etwas verwenden und in eine Auflistung konvertieren und dann jedes einzelne Element dort in ein Byte konvertieren, um Ihr Byte-Array neu zu erstellen.

Es ist einfach zu konvertieren Byte-Array zu String und String zurück zu Byte-Array in Java. Wir müssen wissen, wann wir “neu” richtig anwenden müssen. Es kann wie folgt gemacht werden:

Byte-Array zu String-Konvertierung:

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

String-zu-Byte-Array-Konvertierung:

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

Weitere Informationen finden Sie unter: http://evverythingatonce.blogspot.in/2014/01/tech-talkbyte-array-and-string.html

Die Art der Ausgabe, die Sie von Ihrem Byte-Array sehen ( [B@405217f8 ), ist auch eine Ausgabe für ein Byte-Array mit einer Länge von Null (dh ein new byte[0] ). Es sieht so aus, als wäre diese Zeichenfolge eine Referenz auf das Array und nicht eine Beschreibung des Inhalts des Arrays, wie wir es von der toString() Methode einer regulären Collection erwarten würden.

Wie bei anderen Befragten möchte ich Sie auf die String Konstruktoren hinweisen, die einen byte[] -Parameter akzeptieren, um aus dem Inhalt eines Byte-Arrays eine Zeichenfolge zu erstellen. Sie sollten rohe Bytes aus dem InputStream eines InputStream lesen können, wenn Sie Bytes von einer TCP-Verbindung erhalten möchten.

Wenn Sie diese Bytes bereits als String gelesen haben (mit einem InputStreamReader ), kann der String mit der function getBytes() in Bytes konvertiert werden. getBytes() Sie sicher, dass Sie den gewünschten Zeichensatz an die functionen String-Konstruktor und getBytes() funktioniert nur, wenn die Byte-Daten vom InputStreamReader in Zeichen konvertiert werden können.

Wenn Sie mit rohen Bytes arbeiten wollen, sollten Sie diese Stream-Reader-Schicht wirklich vermeiden.

Können Sie nicht einfach die Bytes als Bytes senden oder jedes Byte in ein Zeichen umwandeln und als String senden? Wenn Sie so vorgehen, wie Sie sind, benötigen Sie mindestens 85 Zeichen in der Zeichenfolge, wenn Sie nur 11 Bytes senden müssen. Sie könnten eine Zeichenfolgendarstellung der Bytes erstellen, also “[B @ 405217f8], die in Python einfach in ein bytearray oder bytearray Objekt konvertiert werden kann. Andernfalls können Sie sie als eine Reihe von Hexadezimalziffern (“5b42403430353231376638”) darstellen, die 22 Zeichen umfassen und auf der Python-Seite mit binascii.unhexlify() leicht entschlüsselt werden können.

Wenn Sie die Zeichenfolge wieder in ein Byte-Array konvertieren möchten, müssen Sie String.getBytes() (oder eine äquivalente Python-function) verwenden, damit Sie das ursprüngliche Byte-Array ausdrucken können.

[JDK8]

 import java.util.Base64; 

Zu string:

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

Zu Byte-Array:

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

Verwenden Sie die folgende Code-API, um Bytecode als Zeichenfolge in Byte-Array zu konvertieren.

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