Apakah ini cara yang disarankan untuk mendapatkan byte dari ByteBuffer
ByteBuffer bb =..
byte[] b = new byte[bb.remaining()]
bb.get(b, 0, b.length);
Tergantung apa yang ingin Anda lakukan.
Jika yang Anda inginkan adalah mengambil byte yang tersisa (antara posisi dan batas), maka apa yang Anda miliki akan berfungsi. Anda juga bisa melakukan:
ByteBuffer bb =..
byte[] b = new byte[bb.remaining()];
bb.get(b);
yang setara dengan javadocs ByteBuffer .
bb.capacity()
mungkin samabb.remaining()
bahkan ketika array pendukung lebih panjang, jadi Anda tidak boleh menggunakan persamaannya sebagai pengujian kapanbb.array()
benar. LihatByteBuffer.slice()
.bb.slice().remaining()
. Dengan cara itu terlihat seperti tempat pembuangan bersih tanpa menyentuh penyangga asli.int
dan menggunakan bitmask:int unsigned_byte = b[k] & 0xff;
untuk beberapa nilaik
.ByteBuffer#clear
dulu?Perhatikan bahwa bb.array () tidak menghormati posisi buffer-byte, dan mungkin lebih buruk lagi jika bytebuffer yang Anda kerjakan adalah potongan dari beberapa buffer lain.
Yaitu
byte[] test = "Hello World".getBytes("Latin1"); ByteBuffer b1 = ByteBuffer.wrap(test); byte[] hello = new byte[6]; b1.get(hello); // "Hello " ByteBuffer b2 = b1.slice(); // position = 0, string = "World" byte[] tooLong = b2.array(); // Will NOT be "World", but will be "Hello World". byte[] world = new byte[5]; b2.get(world); // world = "World"
Yang mungkin bukan yang ingin Anda lakukan.
Jika Anda benar-benar tidak ingin menyalin byte-array, penyelesaiannya bisa dengan menggunakan arrayOffset () + sisa () buffer-buffer, tetapi ini hanya berfungsi jika aplikasi mendukung indeks + panjang byte-buffer itu. kebutuhan.
sumber
Sesimpel itu
private static byte[] getByteArrayFromByteBuffer(ByteBuffer byteBuffer) { byte[] bytesArray = new byte[byteBuffer.remaining()]; byteBuffer.get(bytesArray, 0, bytesArray.length); return bytesArray; }
sumber
final ByteBuffer buffer; if (buffer.hasArray()) { final byte[] array = buffer.array(); final int arrayOffset = buffer.arrayOffset(); return Arrays.copyOfRange(array, arrayOffset + buffer.position(), arrayOffset + buffer.limit()); } // do something else
sumber
Jika seseorang tidak tahu apa-apa tentang keadaan internal dari ByteBuffer (Langsung) yang diberikan dan ingin mengambil seluruh konten buffer, ini dapat digunakan:
ByteBuffer byteBuffer = ...; byte[] data = new byte[byteBuffer.capacity()]; ((ByteBuffer) byteBuffer.duplicate().clear()).get(data);
sumber
ByteBuffer.get(byte[])
mengembalikan aByteBuffer
data
variabel. Pengambil kembalithis
, lihat Javadoc-nya.Ini adalah cara sederhana untuk mendapatkan byte [], tetapi bagian dari tujuan menggunakan ByteBuffer adalah menghindari keharusan membuat byte []. Mungkin Anda bisa mendapatkan apa pun yang Anda inginkan dari byte [] langsung dari ByteBuffer.
sumber