Đây có phải là cách được khuyến nghị để lấy byte từ ByteBuffer không
ByteBuffer bb =..
byte[] b = new byte[bb.remaining()]
bb.get(b, 0, b.length);
Câu trả lời:
Phụ thuộc vào những gì bạn muốn làm.
Nếu những gì bạn muốn là truy xuất các byte còn lại (giữa vị trí và giới hạn), thì những gì bạn có sẽ hoạt động. Bạn cũng có thể làm:
ByteBuffer bb =..
byte[] b = new byte[bb.remaining()];
bb.get(b);
tương đương theo javadocs của ByteBuffer .
bb.slice().remaining()
. Bằng cách đó, nó trông giống như một bãi chứa sạch mà không cần chạm vào bộ đệm ban đầu.
int
và sử dụng mặt nạ bit: int unsigned_byte = b[k] & 0xff;
cho một số giá trị của k
.
ByteBuffer#clear
trước?
Lưu ý rằng bb.array () không tôn trọng vị trí bộ đệm byte và thậm chí có thể tồi tệ hơn nếu bộ đệm byte bạn đang làm việc là một phần của một số bộ đệm khác.
I E
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"
Đó có thể không phải là những gì bạn định làm.
Nếu bạn thực sự không muốn sao chép mảng byte, cách giải quyết có thể là sử dụng arrayOffset () + còn lại () của bộ đệm byte, nhưng điều này chỉ hoạt động nếu ứng dụng hỗ trợ chỉ mục + độ dài của bộ đệm byte nó. nhu cầu.
Đơn giản vậy thôi
private static byte[] getByteArrayFromByteBuffer(ByteBuffer byteBuffer) {
byte[] bytesArray = new byte[byteBuffer.remaining()];
byteBuffer.get(bytesArray, 0, bytesArray.length);
return bytesArray;
}
Nếu một người không biết bất kỳ điều gì về trạng thái bên trong của Bộ đệm Byte (Trực tiếp) đã cho và muốn truy xuất toàn bộ nội dung của bộ đệm, thì có thể sử dụng điều này:
ByteBuffer byteBuffer = ...;
byte[] data = new byte[byteBuffer.capacity()];
((ByteBuffer) byteBuffer.duplicate().clear()).get(data);
ByteBuffer.get(byte[])
trả về aByteBuffer
data
biến. Getter quay trở lại this
, hãy xem Javadoc của nó.
Đây là một cách đơn giản để lấy byte [], nhưng một phần quan điểm của việc sử dụng ByteBuffer là tránh phải tạo byte []. Có lẽ bạn có thể lấy bất cứ thứ gì bạn muốn từ byte [] trực tiếp từ ByteBuffer.
bb.capacity()
có thể bằng nhaubb.remaining()
ngay cả khi mảng hỗ trợ dài hơn, vì vậy bạn không được sử dụng bằng nhau của chúng để kiểm tra xem khi nàobb.array()
là đúng. Thấy chưaByteBuffer.slice()
.