it-swarm.com.de

Java Byte Array zu String zu Byte Array

Ich versuche, ein Byte [] in eine Zeichenfolge zu verstehen, eine Zeichenfolgendarstellung von Byte [] in Byte [] -Konvertierung ... Ich konvertiere mein Byte [] in einen zu sendenden String und erwarte meinen Webservice (in Python geschrieben) um die Daten direkt an den Client zurückzusenden.

Wenn ich die Daten von meiner Java-Anwendung aus sende ...

Arrays.toString(data.toByteArray())

Zu sendende Bytes .. 

[[email protected]

Senden (Dies ist das Ergebnis von Arrays.toString (), das eine Zeichenfolgendarstellung 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 dem Aufrufer eine Zeichenfolge 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ücksenden, wo sie überprüft werden können. 

Die Antwort, die mein Client (als String) erhält, sieht so aus

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

Ich kann nicht scheinen, wie ich die empfangene Zeichenfolge in ein Byte [] zurückbekommen kann.

Was auch immer ich versuche, ich bekomme 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 erhalten, die wie folgt lautet:

[email protected]

Beide unterscheiden sich von meinen gesendeten Daten ... Ich bin sicher, dass mir etwas wirklich einfaches fehlt .... 

Irgendeine Hilfe?!

169
0909EM

Sie können den zurückgegebenen String nicht einfach nehmen und daraus einen String konstruieren ... er ist kein byte[]-Datentyp mehr, er ist bereits ein String; Sie müssen es analysieren. Zum Beispiel :

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**

Sie erhalten einen Hinweis auf Ihr Problem in Ihrer Frage, wo Sie "Whatever I seem to try I end up getting a byte array which looks as follows... [91, 45, ..." sagen, da 91 der Byte-Wert für [ ist, und [91, 45, ... das Byte-Array der Zeichenfolge "[-45, 1, 16, ..." ist.

Die Methode Arrays.toString() gibt eine String-Darstellung des angegebenen Arrays zurück. Das bedeutet, dass der zurückgegebene Wert kein Array mehr ist. Zum Beispiel :

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, enthält s1 die Zeichenfolgendarstellung des Arrays b1, während s2 die Zeichenfolgendarstellung der bytes enthält, die in b1 enthalten sind.

In Ihrem Problem gibt der Server jetzt eine ähnliche Zeichenfolge wie s1 zurück. Um die Darstellung des Arrays wieder herzustellen, benötigen Sie die entgegengesetzte Konstruktormethode. Wenn s2.getBytes() das Gegenteil von new String(b1) ist, müssen Sie das Gegenteil von Arrays.toString(b1) finden, also den Code, den ich im ersten Ausschnitt dieser Antwort eingefügt habe.

255
Yanick Rochon
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 einfach.

126
CorayThan

Was ich getan habe:

Rückkehr zu Kunden:

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

String str = Base64.encodeBase64String(result);

return str;

von Kunden erhalten:

 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== 
20
Neeson.Z

Arrays.toString() erstellt eine Zeichenfolgendarstellung für jedes einzelne Byte in Ihrem byteArray.

Bitte überprüfen Sie die API-Dokumentation Arrays API

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

7
Kal

Es ist einfach, ein Byte-Array in einen String und einen String in ein Byte-Array in Java zu konvertieren. Wir müssen wissen, wann wir 'neu' richtig einsetzen müssen. Es kann wie folgt gemacht werden:

byte-Array zu String-Konvertierung:

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

Konvertierung von Zeichenfolgen in Bytes:

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

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

5
user3469161

Die Art der Ausgabe, die Sie von Ihrem Byte-Array ([[email protected]) sehen, ist auch eine Ausgabe für ein Byte-Array mit einer Länge von null (dh new byte[0]). Es sieht so aus, als wäre diese Zeichenfolge eine Referenz auf das Array und keine Beschreibung des Inhalts des Arrays, wie wir es von einer toString()-Methode einer regulären Sammlung erwarten können.

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

Wenn Sie diese Bytes bereits als String gelesen haben (mit einer InputStreamReader), können Sie die Zeichenfolge mit der Funktion getBytes() in Bytes konvertieren. Stellen Sie sicher, dass Sie den gewünschten Zeichensatz an die Funktionen String-Konstruktor und getBytes() übergeben. Dies funktioniert nur, wenn die Byte-Daten durch die Variable InputStreamReader in Zeichen konvertiert werden können. 

Wenn Sie mit rohen Bytes arbeiten möchten, sollten Sie diesen Stream-Reader-Layer unbedingt vermeiden.

3
fuzzyBSc

Können Sie nicht einfach die Bytes als Bytes senden oder jedes Byte in ein Zeichen umwandeln und als String senden? Wenn Sie es wie Sie tun, werden mindestens 85 Zeichen in der Zeichenfolge verwendet, wenn Sie nur 11 Bytes zum Senden haben. Sie könnten eine Zeichenfolgendarstellung der Bytes erstellen, also "[B @ 405217f8", die in Python leicht in ein bytes- oder ein bytearray-Objekt konvertiert werden kann. Andernfalls könnten Sie sie als eine Reihe hexadezimaler Ziffern ("5b42403430353231376638") darstellen, die 22 Zeichen enthalten, die auf Python-Seite mit binascii.unhexlify() leicht decodiert werden können.

2
JAB

Wenn Sie die Zeichenfolge zurück in ein Byte-Array konvertieren möchten, müssen Sie String.getBytes() (oder eine entsprechende Python-Funktion) verwenden. Dadurch können Sie das ursprüngliche Byte-Array ausdrucken.

1
Martin

[JDK8]

import Java.util.Base64;

Zeichenfolge:

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

Zu Byte-Array:

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

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

 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