Apa cara mudah untuk menggabungkan dua byte
array?
Mengatakan,
byte a[];
byte b[];
Bagaimana cara menggabungkan dua byte
array dan menyimpannya di byte
array lain ?
java
arrays
concatenation
androidGuy
sumber
sumber
System.arrayCopy
,ByteBuffer
dan - tidak begitu efisien tetapi dapat dibaca -ByteArrayOutputStream
semuanya telah dibahas. Kami memiliki lebih dari 7 dupes jawaban yang diberikan di sini. Tolong jangan memposting dupes lagi.Jawaban:
Paling mudah:
sumber
Cara paling elegan untuk melakukan ini adalah dengan a
ByteArrayOutputStream
.sumber
outputStream.write( c );
- Anda tidak harus kembali dan mengedit baris tempat Anda membuat array byte hasil. Juga, memesan ulang array itu sederhana, tidak seperti menggunakan metode arraycopy.a.length + b.length
sebagai argumen untukByteArrayOutputStream
konstruktor. Perhatikan bahwa metode ini masih akan menyalin semua byte ke array baru untuk ditugaskanc[]
! PertimbangkanByteBuffer
metode ini sebagai pesaing dekat, yang tidak menghabiskan memori.Berikut adalah solusi yang bagus menggunakan Jambu 's
com.google.common.primitives.Bytes
:Hal yang hebat tentang metode ini adalah ia memiliki tanda tangan varargs:
yang berarti bahwa Anda dapat menggabungkan jumlah array sewenang-wenang dalam satu pemanggilan metode tunggal.
sumber
Kemungkinan lain adalah menggunakan
java.nio.ByteBuffer
.Sesuatu seperti
Perhatikan bahwa array harus berukuran tepat untuk memulainya, sehingga garis alokasi diperlukan (
array()
hanya mengembalikan array dukungan, tanpa memperhitungkan offset, posisi, atau batas).sumber
ByteBuffer.allocate(int)
adalah metode statis yang mengembalikan instantiatedjava.nio.HeapByteBuffer
, subclass dariByteBuffer
. Metode.put()
dan.compact()
- dan keabstrakan lainnya - dijaga.compact()
baris karena tidak benar.bb.flip(); bb.get(result);
sebagai gantibyte[] result = bb.array();
baris.allocate
metode ini mengungkapkan hal berikut: "Posisi buffer baru akan nol, batasnya adalah kapasitasnya, tandanya akan tidak ditentukan, dan masing-masing elemennya akan diinisialisasi ke nol Ini akan memiliki array pendukung, dan offset arraynya akan nol. " Jadi untuk ini khusus potongan kode, di manaByteBuffer
dialokasikan secara internal, itu tidak masalah.Cara lain adalah dengan menggunakan fungsi utilitas (Anda bisa menjadikan ini metode statis kelas utilitas generik jika Anda mau):
Ajukan seperti ini:
Ini juga akan berfungsi untuk menggabungkan 3, 4, 5 array, dll.
Melakukannya dengan cara ini memberi Anda keuntungan dari kode arraycopy cepat yang juga sangat mudah dibaca dan dipelihara.
sumber
sumber
Jika Anda lebih suka
ByteBuffer
seperti @kalefranz, selalu ada kemungkinan untuk menggabungkan duabyte[]
(atau bahkan lebih) dalam satu baris, seperti ini:sumber
Anda dapat menggunakan perpustakaan pihak ketiga untuk Kode Bersih seperti Apache Commons Lang dan menggunakannya seperti:
sumber
ArrayUtils.addAll(a, b)
danbyte[] c = Bytes.concat(a, b)
, tetapi yang terakhir lebih cepat.Untuk dua atau beberapa array, metode utilitas sederhana dan bersih ini dapat digunakan:
sumber
Gabungkan dua array byte PDF
Jika Anda menggabungkan array dua byte yang berisi PDF, logika ini tidak akan berfungsi. Kita perlu menggunakan alat pihak ketiga seperti PDFbox dari Apache:
sumber
Jika Anda tidak ingin mengacaukan dengan ukuran array, cukup gunakan keajaiban penggabungan string:
Atau tentukan di suatu tempat dalam kode Anda
dan gunakan
Ini, tentu saja, juga bekerja dengan lebih dari dua rangkaian string menggunakan
+
operator tambahan.Keduanya
"l1"
danISO_8859_1
menunjukkan set karakter Latin 1 Barat yang mengkodekan setiap karakter sebagai byte tunggal. Karena tidak ada terjemahan multi-byte yang dilakukan, karakter dalam string akan memiliki nilai yang sama dengan byte (kecuali bahwa mereka akan selalu ditafsirkan sebagai nilai positif, seperti yangchar
tidak ditandatangani). Setidaknya untuk runtime yang disediakan Oracle, byte apa pun karena itu akan benar "diterjemahkan" dan kemudian "dikodekan" lagi.Berhati-hatilah karena string perlu memperluas array byte secara matang, membutuhkan memori tambahan. String juga dapat diinternir dan karenanya tidak mudah dihilangkan. String juga tidak dapat diubah, sehingga nilai-nilai di dalamnya tidak dapat dihancurkan. Karena itu Anda tidak boleh menggabungkan array sensitif dengan cara ini atau Anda harus menggunakan metode ini untuk array byte yang lebih besar. Memberikan indikasi yang jelas tentang apa yang Anda lakukan juga akan diperlukan, karena metode penggabungan array ini bukanlah solusi yang umum.
sumber
Ini cara saya melakukannya!
Fitur :
...
) untuk dipanggil dengan sejumlah byte [].System.arraycopy()
yang diterapkan dengan kode asli khusus mesin, untuk memastikan operasi kecepatan tinggi.int
variabel dengan menggunakan kembali variabeli
danlen
.Ingatlah :
Cara yang lebih baik untuk melakukan ini, adalah dengan menyalin kode @ Jonathan . Masalahnya berasal dari array variabel asli, karena Java membuat variabel baru ketika tipe data ini diteruskan ke fungsi lain.
sumber