I'm mencoba untuk memahami byte[] untuk string, string representasi byte[] untuk byte[] konversi... saya mengkonversi byte[] untuk string untuk mengirim, saya kemudian mengharapkan layanan web saya (yang ditulis dalam python) untuk echo data langsung kembali ke klien.
Ketika saya mengirim data dari aplikasi Java...
Arrays.toString(data.toByteArray())
Byte ke kirim..
[B@405217f8
Mengirim (Ini adalah hasil dari Array.toString() yang seharusnya menjadi representasi string dari saya byte data, data ini akan dikirim melalui kawat):
[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]
Pada python sisi, python server mengembalikan sebuah string ke pemanggil (yang saya bisa melihat ini sama seperti string saya dikirim ke server
[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]
Server harus kembali data ke client, di mana hal ini dapat diverifikasi.
Respon klien saya menerima (string) terlihat seperti
[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]
Saya dapat't tampaknya untuk mencari tahu bagaimana untuk mendapatkan diterima string kembali ke byte[]
Apapun sepertinya aku mencoba aku akhirnya mendapatkan byte array yang terlihat sebagai berikut...
[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]
atau saya bisa mendapatkan representasi byte yang adalah sebagai berikut:
B@2a80d889
Kedua hal ini berbeda dari saya dikirim data... I'm yakin Im hilang sesuatu yang benar-benar sederhana....
Bantuan?!
Anda dapat't hanya mengambil kembali string dan membangun sebuah string dari itu... itu's tidak byte[]
tipe data lagi, it's sudah string; anda perlu untuk mengurai itu. Misalnya :
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
Anda mendapatkan sedikit masalah dalam pertanyaan anda, di mana anda mengatakan "Apapun sepertinya aku mencoba aku akhirnya mendapatkan byte array yang terlihat sebagai berikut... [91, 45, ...
", karena 91
adalah nilai byte untuk [
, jadi [91, 45, ...
adalah byte array dari string "[-45, 1, 16, ...
" string.
Metode Array.toString()
akan kembali String
representasi array yang ditentukan; yang berarti bahwa nilai yang dikembalikan tidak akan menginap lagi. Misalnya :
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";
Seperti yang anda lihat, s1
memegang representasi string dari hotel b1
, sementara s2
memegang representasi string dari byte yang terkandung dalam b1
.
Sekarang, dalam masalah anda, server mengembalikan sebuah string yang mirip dengan s1
, oleh karena itu untuk mendapatkan array representasi kembali, anda perlu kebalikan metode konstruktor. Jika s2.getBytes()
adalah lawan dari new String(b1)
, anda perlu menemukan kebalikan dari Array.toString(b1)
, dengan demikian kode saya disisipkan dalam cuplikan pertama dari jawaban ini.
String coolString = "cool string";
byte[] byteArray = coolString.getBytes();
String reconstitutedString = new String(byteArray);
System.out.println(reconstitutedString);
Bahwa output "keren string" untuk konsol.
It's pretty darn mudah.
Apa yang saya lakukan:
kembali ke klien:
byte[] result = ****encrypted data****;
String str = Base64.encodeBase64String(result);
return str;
terima dari klien:
byte[] bytes = Base64.decodeBase64(str);
data anda akan ditransfer dalam format ini:
OpfyN9paAouZ2Pw+gDgGsDWzjIphmaZbUyFx5oRIN1kkQ1tDbgoi84dRfklf1OZVdpAV7TonlTDHBOr93EXIEBoY1vuQnKXaG+CJyIfrCWbEENJ0gOVBr9W3OlFcGsZW5Cf9uirSmx/JLLxTrejZzbgq3lpToYc3vkyPy5Y/oFWYljy/3OcC/S458uZFOc/FfDqWGtT9pTUdxLDOwQ6EMe0oJBlMXm8J2tGnRja4F/aVHfQddha2nUMi6zlvAm8i9KnsWmQG//ok25EHDbrFBP2Ia/6Bx/SGS4skk/0couKwcPVXtTq8qpNh/aYK1mclg7TBKHfF+DHppwd30VULpA==
Apa Yang Array.toString()
tidak membuat representasi string dari masing-masing individu byte dalam byteArray.
Silahkan periksa dokumentasi API Array API
Untuk mengkonversi string respons kembali ke asli byte array, anda harus menggunakan split(",")
atau sesuatu dan mengubahnya menjadi koleksi dan kemudian mengkonversi setiap item individual dalam sana untuk byte untuk menciptakan anda byte array.
Yang sederhana untuk mengkonversi byte array ke string dan string kembali ke byte array dalam java. kita perlu tahu kapan harus menggunakan 'baru' dengan cara yang benar. Hal ini dapat dilakukan sebagai berikut:
byte array ke string konversi:
byte[] bytes = initializeByteArray();
String str = new String(bytes);
String ke byte array konversi:
String str = "Hello"
byte[] bytes = str.getBytes();
Untuk rincian lebih lanjut, lihat: http://evverythingatonce.blogspot.in/2014/01/tech-talkbyte-array-and-string.html
Jenis output anda melihat dari byte array ([B@405217f8
) juga merupakan output untuk panjang nol byte array (ie new byte[0]
). Sepertinya string ini adalah referensi ke array daripada deskripsi isi dari array seperti yang kita harapkan dari koleksi reguler's toString()
metode.
Seperti halnya dengan responden lain, saya akan mengarahkan anda ke String
konstruktor yang menerima byte[]
parameter untuk membangun sebuah string dari isi byte array. Anda harus mampu membaca baku byte dari sebuah socket's InputStream
jika anda ingin mendapatkan byte dari sebuah koneksi TCP.
Jika anda telah membaca byte sebagai String
(menggunakan InputStreamReader
), kemudian, string dapat diubah menjadi byte menggunakan getBytes()
fungsi. Pastikan untuk lulus dalam yang anda inginkan set karakter untuk kedua String konstruktor dan getBytes()
fungsi, dan ini hanya akan bekerja jika byte data dapat dikonversi ke karakter dengan InputStreamReader
.
Jika anda ingin berurusan dengan baku bytes anda harus benar-benar hindari menggunakan aliran ini pembaca lapisan.
Dapat anda tidak hanya mengirim byte sebagai byte, atau mengkonversi setiap byte ke karakter dan mengirim string? Melakukan hal seperti anda akan mengambil minimal 85 karakter dalam string, ketika anda hanya memiliki 11 byte untuk mengirim. Anda dapat membuat representasi string byte, sehingga'a sama "[B@405217f8", yang dapat dengan mudah dikonversi ke byte
atau bytearray
objek di Python. Kegagalan itu, anda bisa mewakili mereka sebagai rangkaian dari digit heksadesimal ("5b42403430353231376638") mengambil 22 karakter, yang dapat dengan mudah diterjemahkan pada Python samping menggunakan binascii.unhexlify()
.
[JDK8]
import java.util.Base64;
Untuk string:
String str = Base64.getEncoder().encode(new byte[]{ -47, 1, 16, ... });
Ke byte array:
byte[] bytes = Base64.getDecoder().decode("JVBERi0xLjQKMyAwIG9iago8P...");
Gunakan kode di bawah API untuk mengkonversi bytecode sebagai string ke array Byte.
byte[] byteArray = DatatypeConverter.parseBase64Binary("JVBERi0xLjQKMyAwIG9iago8P...");