Apakah ini pendekatan yang benar untuk mengubah ByteBuffer menjadi String dengan cara ini,
String k = "abcd";
ByteBuffer b = ByteBuffer.wrap(k.getBytes());
String v = new String(b.array());
if(k.equals(v))
System.out.println("it worked");
else
System.out.println("did not work");
Alasan saya bertanya adalah apakah ini terlihat terlalu sederhana, sedangkan pendekatan lain seperti Java: Mengubah String ke dan dari ByteBuffer dan masalah terkait terlihat lebih kompleks.
java
string
serialization
bytearray
vikky.rk
sumber
sumber
Jawaban:
EDIT (2018): Jawaban saudara yang diedit oleh @xinyongCheng adalah pendekatan yang lebih sederhana, dan harus menjadi jawaban yang diterima.
Pendekatan Anda akan masuk akal jika Anda mengetahui bahwa byte-byte tersebut ada di charset default platform. Dalam contoh Anda, ini benar karena
k.getBytes()
mengembalikan byte dalam rangkaian karakter default platform.Lebih sering, Anda ingin menentukan pengkodean. Namun, ada cara yang lebih sederhana untuk melakukannya selain pertanyaan yang Anda tautkan. String API menyediakan metode yang mengubah antara String dan array [] byte dalam pengkodean tertentu. Metode ini menyarankan penggunaan CharsetEncoder / CharsetDecoder "ketika kontrol lebih besar atas proses decoding [encoding] diperlukan."
Untuk mendapatkan byte dari String dalam encoding tertentu, Anda bisa menggunakan metode getBytes () saudara:
Untuk meletakkan byte dengan pengkodean tertentu ke dalam String, Anda dapat menggunakan konstruktor String yang berbeda:
Perhatikan bahwa
ByteBuffer.array()
ini adalah operasi opsional. Jika Anda telah membangun ByteBuffer Anda dengan sebuah array, Anda dapat menggunakan array itu secara langsung. Jika tidak, jika Anda ingin aman, gunakanByteBuffer.get(byte[] dst, int offset, int length)
untuk mendapatkan byte dari buffer ke dalam array byte.sumber
ByteBuffer.get
fungsinya, inputnya lagi berupa array byte, bagaimana saya bisa mendapatkannya? tidak masuk akal untuk mengatakan lagi k.getbytes, bukan?ByteBuffer.get(byte[] dst, int offset, int length)
. Anda bisa membuat String darinya dengan konstruktor String () `String (byte [] bytes, int offset, int length, Charset charset). Anda dapat menggunakan nilai offset dan panjang yang sama untuk kedua panggilan.k
adalah String, bukan ByteBuffer.Ada pendekatan yang lebih sederhana untuk memecahkan kode a
ByteBuffer
menjadiString
tanpa masalah, yang disebutkan oleh Andy Thomas.sumber
CharBuffer
decode()
kembaliannya adalahCharSequence
(likeString
), sehingga Anda dapat menghindari salinan tambahan dan menggunakannya secara langsung.Coba ini:
NB. Anda tidak dapat mengubah array byte dengan benar menjadi String tanpa mengetahui pengkodeannya.
saya harap ini membantu
sumber
.array()
mungkin ada pengecualian..array()
metode ini.array()
, Anda juga harus menggunakanarrayOffset()
untuk memulai dari posisi yang benar dalam larik! Ini adalah kesalahan kecil, karena biasanya arrayOffset () adalah 0; tetapi dalam kasus yang jarang terjadi di mana tidak, Anda akan mendapatkan bug yang sulit ditemukan jika Anda tidak memperhitungkannya.Hanya ingin menunjukkan, tidak aman mengasumsikan ByteBuffer.array () akan selalu berfungsi.
Biasanya buffer.hasArray () akan selalu benar atau salah tergantung pada kasus penggunaan Anda. Dalam praktiknya, kecuali jika Anda benar-benar ingin berfungsi dalam keadaan apa pun, aman untuk mengoptimalkan cabang yang tidak Anda perlukan. Tetapi jawaban lainnya mungkin tidak berfungsi dengan ByteBuffer yang dibuat melalui ByteBuffer.allocateDirect ().
sumber
ByteBuffer.wrap(bytes, offset, size)
pabrik.array()
akan mengembalikan seluruhbytes
array. Lebih baik gunakan bentuk xinyong Cheng yang disarankanarray()
, Anda juga harus menggunakanarrayOffset()
untuk memulai dari posisi yang benar dalam larik! Ini adalah kesalahan kecil, karena biasanya arrayOffset () adalah 0; tetapi dalam kasus yang jarang terjadi di mana tidak, Anda akan mendapatkan bug yang sulit ditemukan jika Anda tidak memperhitungkannya.Jawaban yang mengacu pada panggilan
array()
tidak sepenuhnya benar: ketika buffer telah dikonsumsi sebagian, atau mengacu pada bagian dari array (Anda dapatByteBuffer.wrap
membuat array pada offset tertentu, tidak harus dari awal), kita harus memperhitungkan itu dalam perhitungan kami. Ini adalah solusi umum yang berfungsi untuk buffer di semua kasus (tidak mencakup encoding):Untuk masalah yang terkait dengan pengkodean, lihat jawaban Andy Thomas.
sumber
akar dari pertanyaan ini adalah bagaimana cara memecahkan kode byte menjadi string?
ini dapat dilakukan dengan JAVA NIO CharSet:
public final CharBuffer decode(ByteBuffer bb)
sumber
Perhatikan (selain dari masalah encoding) bahwa beberapa kode yang lebih rumit yang ditautkan mengalami kesulitan untuk mendapatkan bagian "aktif" dari ByteBuffer yang dimaksud (misalnya dengan menggunakan posisi dan limit), daripada hanya mengenkode semua byte di seluruh larik pendukung (seperti yang dilakukan banyak contoh dalam jawaban ini).
sumber
Ubah String menjadi ByteBuffer, lalu dari ByteBuffer kembali ke String menggunakan Java:
Yang mencetak string kosong yang dicetak terlebih dahulu, dan kemudian ByteBuffer dicor ke array ():
Ini juga berguna bagi saya, mengurangi string menjadi byte primitif dapat membantu memeriksa apa yang terjadi:
Mencetak string Anda yang ditafsirkan sebagai UTF-8, dan kemudian lagi sebagai ISO-8859-1:
sumber
sumber
Berikut adalah fungsi sederhana untuk mengubah buffer byte menjadi string:
sumber