Jeg' prøver å forstå en byte[] til streng, strengrepresentasjon av byte[] til byte[] konvertering ... Jeg konverterer byte[] til en streng for å sende, jeg forventer deretter at webtjenesten min (skrevet i python) skal ekko dataene rett tilbake til klienten.
Når jeg sender dataene fra Java-applikasjonen min ...
Arrays.toString(data.toByteArray())
Bytes å sende ..
[B@405217f8
Send (Dette er resultatet av Arrays.toString() som skal være en strengrepresentasjon av bytedataene mine, disse dataene vil bli sendt over ledningen):
[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]
På python-siden returnerer python-serveren en streng til den som kaller (som jeg kan se er den samme som strengen jeg sendte til serveren
[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]
Serveren skal returnere disse dataene til klienten, der de kan verifiseres.
Svaret klienten min mottar (som en streng) ser slik ut
[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]
Jeg ser ikke ut til å finne ut hvordan jeg får den mottatte strengen tilbake til en byte[]
Uansett hva jeg synes å prøve jeg ender opp med å få en byte array som ser ut som følger ...
[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]
eller jeg kan få en byte-representasjon som er som følger:
B@2a80d889
Begge disse er forskjellige fra mine sendte data ... Jeg' er sikker på at jeg mangler noe virkelig enkelt....
Noen hjelp?!
Du kan ikke bare ta den returnerte strengen og konstruere en streng fra den ... det er ikke en byte[]
datatype lenger, det er allerede en streng; du må analysere den. For eksempel:
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
Du får et hint om problemet ditt i spørsmålet ditt, der du sier "Uansett hva jeg ser ut til å prøve, ender jeg opp med å få en byte-array som ser ut som følger ... [91, 45, ...
", fordi 91
er byteverdien for [
, så [91, 45, ...
er bytearrayet til strengen "[-45, 1, 16, ...
" streng.
Metoden Arrays.toString()
vil returnere en String
-representasjon av den angitte arrayen; noe som betyr at den returnerte verdien ikke lenger vil være en array. For eksempel:
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";
Som du kan se, inneholder s1
strengrepresentasjonen av matrisen b1
, mens s2
inneholder strengrepresentasjonen av bytene i b1
.
Nå, i problemet ditt, returnerer serveren din en streng som ligner på s1
, derfor trenger du den motsatte konstruktørmetoden for å få arrayrepresentasjonen tilbake. Hvis s2.getBytes()
er det motsatte av new String(b1)
, må du finne det motsatte av Arrays.toString(b1)
, og dermed koden jeg limte inn i det første utdraget av dette svaret.
Det Arrays.toString()
gjør er å opprette en strengrepresentasjon av hver enkelt byte i byteArray.
Vennligst sjekk API-dokumentasjonen Arrays API
For å konvertere svarstrengen tilbake til den opprinnelige byte-matrisen, må du bruke split(",")
eller noe og konvertere den til en samling og deretter konvertere hvert enkelt element der inne til en byte for å gjenskape byte-matrisen.
Kan du ikke bare sende bytene som byte, eller konvertere hver byte til et tegn og sende som en streng? Å gjøre det som du gjør vil ta opp minst 85 tegn i strengen, når du bare har 11 byte å sende. Du kan lage en strengrepresentasjon av bytene, slik at det blir "[B@405217f8", som enkelt kan konverteres til et bytes
eller bytearray
-objekt i Python. Hvis ikke, kan du representere dem som en serie heksadesimale sifre ("5b42403430353231376638") som tar opp 22 tegn, som lett kan dekodes på Python-siden ved hjelp av binascii.unhexlify()
.