Am'm încercarea de a înțelege un byte[] pentru a șir de caractere, șir de reprezentare byte[] pentru byte[] conversia... am converti mea byte[] la un șir de caractere pentru a trimite, apoi am aștepta mea de web service (scris în python) la echo datele direct la client.
Când am trimite datele din aplicație Java...
Arrays.toString(data.toByteArray())
Bytes pentru a trimite..
[B@405217f8
Trimite (Acest lucru este rezultatul de Tablouri.toString() care ar trebui să fie un șir de reprezentare a mea octet de date, aceste date vor fi trimise pe fir):
[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]
Pe partea python, python serverul returnează un șir de caractere pentru a apelantului (pe care o pot vedea este la fel ca string-am trimis la server
[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]
Serverul ar trebui să se întoarcă aceste date la client, în cazul în care acesta poate fi verificată.
Răspunsul meu client primește (ca un șir de caractere) se pare ca
[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]
Pot't par să dau seama cum să obțineți primit înapoi într-un șir byte[]
Tot ce am încercat eu sfârșesc prin obtinerea unui octet matrice care arată după cum urmează...
[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]
sau pot lua un octet de reprezentare care este după cum urmează:
B@2a80d889
Ambele sunt diferite de mi-a trimis datele... am'm sigur Im lipsește ceva foarte simplu....
Nici un ajutor?!
Puteți't ia revenit șir și de a construi un șir de acesta...'s nu byte[]
tip de date, ci's deja un șir de caractere; aveți nevoie pentru a analiza. De exemplu :
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
Veți obține un indiciu de problema în cauză, în cazul în care ai spus " Ce am încercat eu sfârșesc prin obtinerea unui octet matrice care arată după cum urmează... [91, 45, ...", deoarece
91este valoarea octet pentru
[, deci
[91, 45, ...este o matrice octet din șir "
[-45, 1, 16, ...`" string.
Metoda `Tablouri.toString () va returna un "String" reprezentare a specificat matrice; ceea ce înseamnă că valoarea returnată nu va fi o serie mai. De exemplu :
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";
După cum puteți vedea, " s1 "deține reprezentarea șir de matrice "b1", în timp ce " s2 "deține reprezentarea șir de bytes conținute în "b1".
Acum, în problema ta, serverul returnează un șir similare pentru a "s1", prin urmare, pentru a obține matrice de reprezentare spate, ai nevoie de opusul metoda constructor. Dacă s2.getBytes()
este opusul lui new String(b1)
, aveți nevoie pentru a găsi vizavi de Tablouri.toString(b1)`, astfel, codul l-am lipit în primul fragment de acest răspuns.
Ce am facut:
revenirea la clienți:
byte[] result = ****encrypted data****;
String str = Base64.encodeBase64String(result);
return str;
primiți de la clienți:
byte[] bytes = Base64.decodeBase64(str);
datele dumneavoastră vor fi transferate în acest format:
OpfyN9paAouZ2Pw+gDgGsDWzjIphmaZbUyFx5oRIN1kkQ1tDbgoi84dRfklf1OZVdpAV7TonlTDHBOr93EXIEBoY1vuQnKXaG+CJyIfrCWbEENJ0gOVBr9W3OlFcGsZW5Cf9uirSmx/JLLxTrejZzbgq3lpToYc3vkyPy5Y/oFWYljy/3OcC/S458uZFOc/FfDqWGtT9pTUdxLDOwQ6EMe0oJBlMXm8J2tGnRja4F/aVHfQddha2nUMi6zlvAm8i9KnsWmQG//ok25EHDbrFBP2Ia/6Bx/SGS4skk/0couKwcPVXtTq8qpNh/aYK1mclg7TBKHfF+DHppwd30VULpA==
Ce Tablouri.toString()` nu este de a crea un șir de reprezentare a fiecărui octet în byteArray.
Vă rugăm să verificați documentația API Tablouri API
Pentru a converti răspuns șir cu cel original octet matrice, trebuie să folosim split(",") sau ceva de genul și de ao transforma într-o colecție și apoi converti fiecare element în parte acolo de un octet pentru a recrea matrice octet.
Simplu de a converti matrice octet pentru coarde și șir de matrice octet în java. avem nevoie să știți atunci când pentru a utiliza 'nou' în mod corect. Acesta poate fi realizat după cum urmează:
matrice octet pentru coarde de conversie:
byte[] bytes = initializeByteArray();
String str = new String(bytes);
Șir de octet matrice de conversie:
String str = "Hello"
byte[] bytes = str.getBytes();
Pentru mai multe detalii, uita-te la: http://evverythingatonce.blogspot.in/2014/01/tech-talkbyte-array-and-string.html
Genul de ieșire vedeți de la byte array ([B@405217f8
) este, de asemenea, o ieșire pentru o lungime zero byte array (de exemplu, new byte[0]
). Se pare că acest șir este o referință la matrice, mai degrabă decât o descriere a conținutului de matrice ca ne-am putea aștepta de la o colectare regulată's `toString () metoda.
Ca și cu alte respondenți, aș dori să vă "coarda" constructori care accepta un byte[]parametru pentru a construi un șir de conținutul unei matrice octet. Tu ar trebui să fie capabil să citească prime de bytes dintr-un soclu's
InputStream dacă doriți să obțineți bytes dintr-o conexiune TCP.
Dacă ați citit deja aceste bytes ca un "String" (folosind un InputStreamReader
), apoi, șirul poate fi convertit în bytes, folosind getBytes () funcția. Fi sigur de a trece in personajul dorit setat la ambele Șir constructor și
getBytes()funcții, iar acest lucru va funcționa numai dacă octet de date pot fi convertite în caractere de
InputStreamReader`.
Dacă doriți să se ocupe cu prime bytes ar trebui să evitați să utilizați acest flux de cititor strat.
Nu poți trimite bytes fel de bytes, sau de a converti fiecare octet de la un personaj și trimite ca un șir de caractere? Faci ca tine se va lua un minim de 85 de caractere în șir, atunci când ai doar 11 bytes pentru a trimite. Ai putea crea o reprezentare șir de octeți, așa că'd "[B@405217f8", care pot fi ușor convertite la o bytes " sau " bytearray
obiect în Python. În caz contrar, ai putea să-i reprezinte ca pe o serie de cifre hexazecimale ("5b42403430353231376638") preluarea de 22 de caractere, care ar putea fi decodat cu ușurință pe partea Python folosind binascii.unhexlify()
.
[JDK8]
import java.util.Base64;
Pentru string:
String str = Base64.getEncoder().encode(new byte[]{ -47, 1, 16, ... });
Pentru matrice octet:
byte[] bytes = Base64.getDecoder().decode("JVBERi0xLjQKMyAwIG9iago8P...");
Folosiți codul de mai jos API pentru a converti bytecode ca șir de matrice Octet.
byte[] byteArray = DatatypeConverter.parseBase64Binary("JVBERi0xLjQKMyAwIG9iago8P...");