ByteBuffer'dan bayt almanın önerilen yolu bu mu?
ByteBuffer bb =..
byte[] b = new byte[bb.remaining()]
bb.get(b, 0, b.length);
Yanıtlar:
Ne yapmak istediğine bağlı.
İstediğiniz kalan baytları almaksa (konum ve sınır arasında), o zaman sahip olduğunuz şey çalışacaktır. Ayrıca şunları da yapabilirsiniz:
ByteBuffer bb =..
byte[] b = new byte[bb.remaining()];
bb.get(b);
burada uygun olarak eşdeğerdir ByteBuffer javadocs.
bb.slice().remaining()
. Bu şekilde, orijinal tampona dokunmadan temiz bir çöplük gibi görünür.
int
bir bit maskesi kullanmalısınız: int unsigned_byte = b[k] & 0xff;
değerinin bir değeri için k
.
ByteBuffer#clear
önce çağırır mısınız?
Bb.array () işlevinin bayt arabellek konumunu kabul etmediğini ve üzerinde çalıştığınız baytebuffer başka bir arabellek dilimi ise daha da kötü olabileceğini unutmayın.
Yani
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"
Yapmak istediğin şey bu olmayabilir.
Bayt dizisini gerçekten kopyalamak istemiyorsanız, geçici bir çözüm, bayt arabelleğinin arrayOffset () + kalan () işlevini kullanmak olabilir, ancak bu yalnızca uygulama, bayt arabelleğinin dizin + uzunluğunu destekliyorsa işe yarar. ihtiyacı var.
Kadar basit
private static byte[] getByteArrayFromByteBuffer(ByteBuffer byteBuffer) {
byte[] bytesArray = new byte[byteBuffer.remaining()];
byteBuffer.get(bytesArray, 0, bytesArray.length);
return bytesArray;
}
Verilen (Doğrudan) ByteBuffer'ın dahili durumu hakkında hiçbir şey bilmiyorsanız ve tamponun tüm içeriğini almak istiyorsa, bu kullanılabilir:
ByteBuffer byteBuffer = ...;
byte[] data = new byte[byteBuffer.capacity()];
((ByteBuffer) byteBuffer.duplicate().clear()).get(data);
ByteBuffer.get(byte[])
döndürür aByteBuffer
data
değişkenin içindedirler. Alıcı geri döner this
, Javadoc'una bakın.
Bu, bir bayt [] almanın basit bir yoludur, ancak ByteBuffer kullanmanın amacının bir kısmı, bir bayt [] oluşturmak zorunda kalmamaktır. Belki de almak istediğiniz her şeyi bayttan [] doğrudan ByteBuffer'dan alabilirsiniz.
bb.capacity()
olabileceğini unutmayınbb.remaining()
, bu nedenle eşitliklerini ne zamanbb.array()
doğru olduğuna dair bir test olarak kullanmamalısınız . BakınByteBuffer.slice()
.