2009-03-24 4 views

उत्तर

82

से बाइट्स प्राप्त करने के लिए इस सिफारिश रास्ता नहीं है निर्भर करता है कि आप क्या करना चाहते हैं।

यदि आप जो चाहते हैं वह शेष बाइट्स (स्थिति और सीमा के बीच) को पुनर्प्राप्त करना है, तो आपके पास क्या काम करेगा। आप, साथ ही कर सकता है:

ByteBuffer bb =.. 

byte[] b = new byte[bb.remaining()] 
bb.get(b); 

जो ByteBuffer javadocs के अनुसार बराबर है।

+5

सही। और ध्यान दें कि 'bb.capacity()' * * बराबर 'bb.remaining()' बराबर हो सकता है जब बैकिंग सरणी अधिक हो, तो आपको 'bb.array()' सही होने पर परीक्षण के रूप में उनकी समानता का उपयोग नहीं करना चाहिए । 'ByteBuffer.slice()' देखें। – cdunn2001

+0

@ जेसनएस मेरे पास [बाइटबफर] पर एक प्रश्न है (http://stackoverflow.com/questions/40798677/combine-multiple-fields-into-a-single-byte-array-using-bytebuffer)। यह देखना चाहता था कि क्या आप मदद कर सकते हैं। – user1950349

+0

ध्यान दें कि, बफर की स्थिति बदलने से बचने के लिए, मैंने 'bb.slice() शेष()' का उपयोग किया। इस तरह यह मूल बफर को छूए बिना एक साफ डंप की तरह दिखता है। –

2

बाइट [] प्राप्त करने का यह एक आसान तरीका है, लेकिन बाइटबफर का उपयोग करने के बिंदु का हिस्सा बाइट [] बनाने से परहेज कर रहा है। शायद आप बाइटबफर से बाइट [] से जो कुछ भी प्राप्त करना चाहते हैं उसे प्राप्त कर सकते हैं।

+10

लेकिन अक्सर आपको कुछ कॉल करने की आवश्यकता होगी (अपने कोड में नहीं) जो बाइट [] लेता है, इसलिए कनवर्ट करना वैकल्पिक नहीं है। –

16

ध्यान दें कि bb.array() बाइट-बफर स्थिति का सम्मान नहीं करता है, और यदि आप जिस बाइटबफर पर काम कर रहे हैं वह कुछ और बफर का टुकड़ा है तो इससे भी बदतर हो सकता है।

आईई।

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" 

जो आप करना चाहते हैं वह नहीं हो सकता है।

यदि आप वास्तव में बाइट-सरणी की प्रतिलिपि नहीं बनाना चाहते हैं, तो बाइट-बफर के सरणी ऑफसेट() + शेष() का उपयोग करने के लिए एक कार्य-आसपास हो सकता है, लेकिन यह केवल तभी काम करता है जब एप्लिकेशन इंडेक्स + की लंबाई का समर्थन करता है बाइट-बफर की जरूरत है।

3
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 
3

एक दिया (प्रत्यक्ष) की आंतरिक स्थिति के बारे में कुछ भी पता नहीं होता है ByteBuffer और बफर की पूरी सामग्री प्राप्त कर करना चाहता है, यह किया जा सकता है:

ByteBuffer byteBuffer = ...; 
byte[] data = new byte[byteBuffer.capacity()]; 
((ByteBuffer) byteBuffer.duplicate().clear()).get(data); 
1

के रूप में के रूप में सरल कि

private static byte[] getByteArrayFromByteBuffer(ByteBuffer byteBuffer) { 
    byte[] bytesArray = new byte[byteBuffer.remaining()]; 
    byteBuffer.get(bytesArray, 0, bytesArray.length); 
    return bytesArray; 
} 
संबंधित मुद्दे