जावा में एक बाइटबफ़र से बाइट सरणी प्राप्त करता है


94

क्या यह बाइटबफ़र से बाइट्स प्राप्त करने का अनुशंसित तरीका है

ByteBuffer bb =..

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

जवाबों:


107

निर्भर करता है कि आप क्या करना चाहते हैं।

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

ByteBuffer bb =..

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

जो बाइटबफ़र जेवाडॉक्स के अनुसार बराबर है ।


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

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

यह विधि मुझे हस्ताक्षरित बाइट्स देती है लेकिन मैं अहस्ताक्षरित चाहता हूं ... कोई विचार?
एच रावल

जावा के पास अहस्ताक्षरित पूर्णांकों की धारणा नहीं है, केवल हस्ताक्षरित हैं। यदि आप "अहस्ताक्षरित बाइट्स" चाहते हैं, तो आपको कुछ मूल्य के लिए intबिटमैस्क के रूप में कास्ट और उपयोग करने की आवश्यकता int unsigned_byte = b[k] & 0xff;है k
जेसन एस

यदि आप संपूर्ण बफ़र को बाइट सरणी में प्राप्त करना चाहते हैं, तो क्या आप ByteBuffer#clearपहले कॉल करेंगे ?
केनी वर्डेन

21

ध्यान दें कि 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"

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

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


"bb.array () बाइट-बफ़र स्थिति का सम्मान नहीं करता है", क्या आप हमें इस भाग के बारे में अधिक जानकारी प्रदान कर सकते हैं। मैंने स्लाइस उदाहरण को समझा, लेकिन इसके बारे में और अधिक विवरण की आवश्यकता है कि क्यों bb.array () गड़बड़
kkrishnaai

5

इतना सरल है

  private static byte[] getByteArrayFromByteBuffer(ByteBuffer byteBuffer) {
    byte[] bytesArray = new byte[byteBuffer.remaining()];
    byteBuffer.get(bytesArray, 0, bytesArray.length);
    return bytesArray;
}

4
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

4

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

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

ByteBuffer.get(byte[])ByteBuffer
pyb

तथा...? यकीन नहीं है कि आप क्या मतलब है, माफ करना।
टॉम माईस्क

सवाल यह है कि एक बाइटबफर से बाइट [] कैसे जाए।
pyb

2
एक बार बुलाया गया, वे dataचर में हैं। गेटवे लौटता है this, इसका जावदोक देखें।
टॉम माईस्क

धन्यवाद, मुझे वह नहीं मिला। चूंकि प्राप्त विधि एक मान लौटा रही है, मुझे उम्मीद नहीं थी कि इसका साइड इफेक्ट भी होगा।
pyb

1

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


15
लेकिन अक्सर आपको बाइट लेने के लिए कुछ (अपने कोड में नहीं) कॉल करना होगा [], इसलिए कनवर्टिंग वैकल्पिक नहीं है।
जेम्स मूर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.