Ich versuche, ein Byte[] zu String, String-Darstellung von Byte[] zu Byte[] Konvertierung zu verstehen... Ich konvertiere meine byte[] zu einer Zeichenfolge zu senden, ich erwarte dann meine Web-Service (in Python geschrieben), um die Daten direkt zurück an den Client Echo.
Wenn ich die Daten aus meiner Java-Anwendung sende...
Arrays.toString(data.toByteArray())
Zu sendende Bytes...
[B@405217f8
Senden (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 Zeichenkette an den Aufrufer zurück (die, wie ich sehen kann, mit der Zeichenkette übereinstimmt, die ich an den Server geschickt 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 überprüft werden können.
Die Antwort, die mein Client erhält (als String), 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 herausfinden, wie ich die empfangene Zeichenkette zurück in ein byte[]
Egal, was ich versuche, ich erhalte 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 aussieht:
B@2a80d889
Beide unterscheiden sich von meinen gesendeten Daten... Ich bin sicher, ich übersehe etwas wirklich einfaches....
Irgendeine Hilfe?!
Sie können nicht einfach die zurückgegebene Zeichenkette nehmen und eine Zeichenkette daraus konstruieren... es ist kein Byte[]
Datentyp mehr, es ist bereits eine Zeichenkette; Sie müssen sie parsen. 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, in der Sie sagen "Was auch immer ich zu versuchen scheine, am Ende erhalte ich ein Byte-Array, das wie folgt aussieht... [91, 45, ...
", denn 91
ist der Byte-Wert für [
, also ist [91, 45, ...
das Byte-Array des Strings "[-45, 1, 16, ...
" string.
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 können, enthält s1
die String-Darstellung des Arrays b1
, während s2
die String-Darstellung der Bytes enthält, die in b1
enthalten sind.
In Ihrem Problem gibt Ihr Server eine Zeichenkette zurück, die s1
ähnelt. Um die Darstellung des Arrays zurückzubekommen, 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.
Mit "Arrays.toString()" wird eine Zeichenkettendarstellung für jedes einzelne Byte in Ihrem ByteArray erstellt.
Bitte lesen Sie die API-Dokumentation Arrays API
Um die Antwortzeichenkette wieder in das ursprüngliche Byte-Array umzuwandeln, müssen Sie split(",")
oder etwas Ähnliches verwenden und es in eine Sammlung umwandeln und dann jedes einzelne Element darin in ein Byte umwandeln, um Ihr Byte-Array neu zu erstellen.
Können Sie die Bytes nicht einfach als Bytes senden, oder jedes Byte in ein Zeichen umwandeln und als Zeichenkette senden? Wenn Sie so vorgehen, benötigt die Zeichenkette mindestens 85 Zeichen, obwohl Sie nur 11 Bytes zu senden haben. Sie könnten eine String-Darstellung der Bytes erstellen, also "[B@405217f8", die leicht in ein bytes
- oder bytearray
-Objekt in Python umgewandelt werden kann. Andernfalls könnte man sie als eine Reihe von hexadezimalen Ziffern darstellen ("5b42403430353231376638"), die 22 Zeichen umfassen, die auf der Python-Seite mit binascii.unhexlify()
leicht dekodiert werden könnten.