Apakah ini cara yang disarankan untuk mendapatkan byte dari ByteBuffer
ByteBuffer bb =..
byte[] b = new byte[bb.remaining()]
bb.get(b, 0, b.length);
Jawaban:
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.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 nilai k
.
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.
Sesimpel itu
private static byte[] getByteArrayFromByteBuffer(ByteBuffer byteBuffer) {
byte[] bytesArray = new byte[byteBuffer.remaining()];
byteBuffer.get(bytesArray, 0, bytesArray.length);
return bytesArray;
}
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);
ByteBuffer.get(byte[])
mengembalikan aByteBuffer
data
variabel. Pengambil kembali this
, 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.
bb.capacity()
mungkin samabb.remaining()
bahkan ketika array pendukung lebih panjang, jadi Anda tidak boleh menggunakan persamaannya sebagai pengujian kapanbb.array()
benar. LihatByteBuffer.slice()
.