นี่เป็นวิธีที่แนะนำในการรับไบต์จาก ByteBuffer หรือไม่
ByteBuffer bb =..
byte[] b = new byte[bb.remaining()]
bb.get(b, 0, b.length);
นี่เป็นวิธีที่แนะนำในการรับไบต์จาก ByteBuffer หรือไม่
ByteBuffer bb =..
byte[] b = new byte[bb.remaining()]
bb.get(b, 0, b.length);
คำตอบ:
ขึ้นอยู่กับสิ่งที่คุณต้องการจะทำ.
หากสิ่งที่คุณต้องการคือการดึงข้อมูลไบต์ที่เหลืออยู่ (ระหว่างตำแหน่งและขีด จำกัด ) สิ่งที่คุณมีจะได้ผล คุณสามารถทำได้:
ByteBuffer bb =..
byte[] b = new byte[bb.remaining()];
bb.get(b);
ซึ่งเทียบเท่ากับByteBuffer javadocs
bb.slice().remaining()
โปรดทราบว่าเพื่อหลีกเลี่ยงการเปลี่ยนตำแหน่งของบัฟเฟอร์ที่ฉันใช้ วิธีนี้จะดูเหมือนการถ่ายโอนข้อมูลที่สะอาดโดยไม่ต้องสัมผัสกับบัฟเฟอร์เดิม
int
และใช้ bitmask: int unsigned_byte = b[k] & 0xff;
สำหรับค่าบางอย่างของk
.
ByteBuffer#clear
ก่อนหรือไม่?
โปรดทราบว่า bb.array () ไม่ให้เกียรติตำแหน่งไบต์ - บัฟเฟอร์และอาจแย่กว่านั้นหาก bytebuffer ที่คุณกำลังทำงานอยู่นั้นเป็นส่วนของบัฟเฟอร์อื่น ๆ
ได้แก่
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"
ซึ่งอาจไม่ใช่สิ่งที่คุณตั้งใจจะทำ
หากคุณไม่ต้องการคัดลอกไบต์อาร์เรย์จริงๆวิธีแก้ปัญหาอาจเป็นการใช้ arrayOffset ของไบต์บัฟเฟอร์ () + ที่เหลือ () แต่จะใช้ได้เฉพาะเมื่อแอปพลิเคชันรองรับดัชนี + ความยาวของไบต์ - บัฟเฟอร์ ความต้องการ
ง่ายๆแค่นั้นเอง
private static byte[] getByteArrayFromByteBuffer(ByteBuffer byteBuffer) {
byte[] bytesArray = new byte[byteBuffer.remaining()];
byteBuffer.get(bytesArray, 0, bytesArray.length);
return bytesArray;
}
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
หากไม่มีใครรู้อะไรเกี่ยวกับสถานะภายในของ ByteBuffer (โดยตรง) ที่กำหนดและต้องการดึงเนื้อหาทั้งหมดของบัฟเฟอร์สิ่งนี้สามารถใช้ได้:
ByteBuffer byteBuffer = ...;
byte[] data = new byte[byteBuffer.capacity()];
((ByteBuffer) byteBuffer.duplicate().clear()).get(data);
ByteBuffer.get(byte[])
ส่งกลับ aByteBuffer
data
ตัวแปร getter กลับthis
มาดู Javadoc ของมัน
นี่เป็นวิธีง่ายๆในการหาไบต์ [] แต่ส่วนหนึ่งของการใช้ ByteBuffer คือการหลีกเลี่ยงการสร้างไบต์ [] บางทีคุณอาจได้รับสิ่งที่คุณต้องการจากไบต์ [] โดยตรงจาก ByteBuffer
bb.capacity()
อาจเท่ากันbb.remaining()
แม้ว่าอาร์เรย์สำรองจะยาวกว่าดังนั้นคุณต้องไม่ใช้ความเท่าเทียมกันเป็นการทดสอบว่าเมื่อbb.array()
ใดถูกต้อง ดูByteBuffer.slice()
.