Java Byte Array ke String ke Byte Array

180

Saya mencoba memahami byte [] ke string, representasi string dari byte [] ke byte [] konversi ... Saya mengkonversi byte saya [] ke string untuk dikirim, saya kemudian mengharapkan layanan web saya (ditulis dengan python) untuk menggemakan data langsung kembali ke klien.

Ketika saya mengirim data dari aplikasi Java saya ...

Arrays.toString(data.toByteArray())

Bytes untuk dikirim ..

[B@405217f8

Kirim (Ini adalah hasil dari Arrays.toString () yang seharusnya merupakan representasi string dari data byte saya, 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]

Di sisi python, server python mengembalikan sebuah string ke pemanggil (yang bisa saya lihat adalah sama dengan string yang saya kirim ke server

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

Server harus mengembalikan data ini ke klien, di mana itu dapat diverifikasi.

Respons klien saya menerima (sebagai string) seperti

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

Sepertinya saya tidak tahu cara mendapatkan kembali string yang diterima ke byte []

Apa pun yang saya coba saya akhirnya mendapatkan array byte 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 yaitu sebagai berikut:

B@2a80d889

Keduanya berbeda dari data yang saya kirim ... Saya yakin saya kehilangan sesuatu yang sangat sederhana ....

Ada bantuan ?!

0909EM
sumber

Jawaban:

272

Anda tidak bisa hanya mengambil string yang dikembalikan dan membangun string dari itu ... itu bukan byte[]tipe data lagi, ini sudah menjadi string; Anda perlu menguraikannya. Sebagai contoh :

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 petunjuk tentang masalah Anda dalam pertanyaan Anda, di mana Anda mengatakan " Whatever I seem to try I end up getting a byte array which looks as follows... [91, 45, ...", karena 91nilai byte untuk [, demikian [91, 45, ...juga array byte dari string " [-45, 1, 16, ..." string.

Metode ini Arrays.toString()akan mengembalikan Stringrepresentasi dari array yang ditentukan; artinya nilai yang dikembalikan tidak akan menjadi array lagi. Sebagai contoh :

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, s1pegang representasi string dari array b1 , sementara s2memegang representasi string dari byte yang ada di dalamnya b1.

Sekarang, dalam masalah Anda, server Anda mengembalikan string yang mirip dengan s1, oleh karena itu untuk mendapatkan representasi array kembali, Anda memerlukan metode konstruktor yang berlawanan. Jika s2.getBytes()kebalikan dari new String(b1), Anda harus menemukan kebalikan dari Arrays.toString(b1), jadi kode yang saya tempelkan di cuplikan pertama dari jawaban ini.

Yanick Rochon
sumber
Luar biasa! Saya pikir Anda sudah benar-benar mengerti apa yang saya cari ... Saya bukan dari latar belakang Java, jadi saya tidak bisa benar-benar mengetahui konversi yang saya butuhkan. Sekadar info, saya mengirim s1 ke server, dan server membalas dengan s1 (saya dapat memverifikasi bahwa server menerima dan menjawab dengan data dalam s1), jadi saya perlu kebalikan dari Arrays.toString () sebagai Anda menyarankan ... DAN solusi Anda sangat bagus! Bersulang!
0909EM
Yanick terima kasih. Tetapi loop untuk 2046 kali untuk setiap gambar sebagai nilai byte. Panjangnya adalah 2046. Apakah ada metode lain untuk melakukan ini?
Gugan
Jika data yang Anda terima benar - benar string yang dapat dibaca manusia yang perlu diurai seperti nilai variabel responsedalam jawaban saya, maka sayangnya tidak, tidak ada cara lain. Cara terbaik bagi Anda untuk menerima byte sebagai data mentah (sebagai biner) alih-alih string, atau mungkin bahkan sebagai string Base64, yang hanya mengharuskan Anda untuk mengubahnya kembali sebagai nilai 256 (biner) basis.
Yanick Rochon
3
Untuk menambahkan apa yang dinyatakan sebagai jawaban yang benar (walaupun tidak lengkap): 1) Setiap array [] yang dikonversi menjadi String di Java harus menentukan set karakter. Apakah byte array [] UTF-8 atau yang lain? Tidak spesifik atau mengetahui apa itu bisa membuat bug. 2) Java menggunakan pengkodean Big-Endian tetapi sistem M $ misalnya menggunakan Little-Endian. Saat berurusan dengan array byte [] yang merupakan String (berbasis karakter), itu tidak masalah. Namun, jika array byte [] mewakili angka, 'endianess' dari sistem sumber / target menjadi penting.
Darrell Teague
130
String coolString = "cool string";

byte[] byteArray = coolString.getBytes();

String reconstitutedString = new String(byteArray);

System.out.println(reconstitutedString);

Itu menghasilkan "string keren" ke konsol.

Sangat mudah.

CorayThan
sumber
6
Begitu banyak downvotes, tetapi sangat sedikit penjelasan ... Apakah yang saya katakan tidak berhasil? Ini berfungsi ketika saya menggunakannya, dan pertanyaannya adalah bagaimana mengkonversi dari byte ke string dan kembali lagi, kan?
CorayThan
2
Jawaban yang memecahkan ini sebenarnya ditandai sebagai jawaban. Dari ingatan itu tidak sesederhana seperti yang Anda sarankan ... Lihat jawaban Yanick, saya pikir Anda telah salah mengerti apa yang saya minta, tapi terima kasih atas masukannya.
0909EM
9
@CorayThan Sebenarnya tidak, ini tidak menjawab pertanyaan OP sama sekali. Jika Anda benar-benar membacanya, Anda akan melihat bahwa yang byte[]diterimanya diwakili sebagai String; yaitu "[97, 98, 99]"tidak [97, 98, 99]. Artinya, jawaban Anda bahkan tidak berlaku untuk situasi ini.
b1nary.atr0phy
2
Jawaban Anda adalah Stringuntuk byte[]untuk String. Saya pikir persyaratan dimaksud adalah byte[]untuk Stringuntuk byte[].
Wundwin Lahir
13
Bahkan mungkin jawaban yang salah untuk pertanyaan yang diajukan, tetapi itu membantu saya untuk menyelesaikan masalah. Itu sebabnya orang harus berpikir sedikit sebelum merendahkan balasan orang lain. Terima kasih CorayThan!
Roberto Santos
21

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== 
Saorikido
sumber
7

Apa yang Arrays.toString()dilakukan adalah membuat representasi string dari setiap byte individual di byteArray Anda.

Silakan periksa API Array dokumentasi dokumentasi

Untuk mengonversi string respons Anda kembali ke array byte asli, Anda harus menggunakan split(",")atau sesuatu dan mengubahnya menjadi koleksi dan kemudian mengonversi setiap item di sana menjadi byte untuk membuat ulang array byte Anda.

Kal
sumber
5

Sederhana untuk mengubah byte array ke string dan string kembali ke byte array di java. kita perlu tahu kapan harus menggunakan 'baru' dengan cara yang benar. Itu bisa dilakukan sebagai berikut:

byte array ke konversi string:

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

Konversi array string ke byte:

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

Untuk detail lebih lanjut, lihat: http://evverythingatonce.blogspot.in/2014/01/tech-talkbyte-array-and-string.html

pengguna3469161
sumber
2
Tidak, Anda belum membaca pertanyaan atau mungkin Anda tidak mengerti masalahnya. Seperti yang akan Anda perhatikan, pertanyaan itu dijawab bertahun-tahun yang lalu ...
0909EM
3

Jenis output yang Anda lihat dari array byte Anda ( [B@405217f8) juga merupakan output untuk array byte panjang nol (yaitu new byte[0]). Sepertinya string ini adalah referensi ke array daripada deskripsi isi array seperti yang mungkin kita harapkan dari toString()metode koleksi reguler .

Seperti halnya responden lain, saya akan mengarahkan Anda ke Stringkonstruktor yang menerima byte[]parameter untuk membangun string dari isi array byte. Anda harus dapat membaca byte mentah dari soket InputStreamjika Anda ingin mendapatkan byte dari koneksi TCP.

Jika Anda sudah membaca byte tersebut sebagai String(menggunakan InputStreamReader), maka, string dapat dikonversi ke byte menggunakan getBytes()fungsi. Pastikan untuk mengirimkan karakter yang Anda inginkan ke konstruktor dan getBytes()fungsi String , dan ini hanya akan berfungsi jika data byte dapat dikonversi ke karakter oleh InputStreamReader.

Jika Anda ingin berurusan dengan byte mentah, Anda harus benar-benar menghindari menggunakan layer pembaca aliran ini.

fuzzyBSc
sumber
2

Bisakah Anda tidak hanya mengirim byte sebagai byte, atau mengkonversi setiap byte ke karakter dan mengirim sebagai string? Melakukannya seperti Anda akan mengambil minimal 85 karakter dalam string, ketika Anda hanya memiliki 11 byte untuk dikirim. Anda bisa membuat representasi string dari byte, jadi itu akan menjadi "[B @ 405217f8", yang dapat dengan mudah dikonversi ke bytesatau bytearrayobjek dengan Python. Gagal itu, Anda bisa mewakili mereka sebagai serangkaian digit heksadesimal ("5b42403430353231376638") yang mengambil 22 karakter, yang dapat dengan mudah didekodekan pada sisi Python menggunakan binascii.unhexlify().

TUSUKAN
sumber
1
[B@405217f8adalah ID objek Java dari array, bukan konten array. ID objek tentu tidak dapat "dengan mudah dikonversi ke byte atau objek bytearray dengan python". Ukuran terbaik yang dapat Anda lakukan adalah mengonversi byte [] ke string base64.
Boris B.
Anda benar, saya dengan naif mengasumsikan 0909EM cukup tahu untuk membedakan antara (diketik) alamat suatu objek dan isi objek.
JAB
2

[JDK8]

import java.util.Base64;

Ke string:

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

Ke byte array:

byte[] bytes = Base64.getDecoder().decode("JVBERi0xLjQKMyAwIG9iago8P...");
Patricio Córdova
sumber
1

Jika Anda ingin mengubah string kembali menjadi array byte Anda harus menggunakan String.getBytes()(atau fungsi Python yang setara) dan ini akan memungkinkan Anda mencetak array byte asli.

Martin
sumber
0

Gunakan API kode di bawah ini untuk mengonversi bytecode sebagai string ke array Byte.

 byte[] byteArray = DatatypeConverter.parseBase64Binary("JVBERi0xLjQKMyAwIG9iago8P...");
Ajay Kumar
sumber
-1

[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);
3logi
sumber