জাভাতে বাইটবফার থেকে বাইট অ্যারে পান


97

এটি কি বাইটবফার থেকে বাইটগুলি পাওয়ার প্রস্তাবিত উপায়

ByteBuffer bb =..

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

উত্তর:


108

আপনি যা করতে চান তা নির্ভর করে।

আপনি যা চান তা যদি বাকী বাক্সগুলি পুনরুদ্ধার করা হয় (অবস্থান এবং সীমাতে), তবে আপনার যা আছে তা কাজ করবে। আপনি ঠিক করতে পারেন:

ByteBuffer bb =..

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

যা বাইটবফার জাভাদোকসের সমতুল্য ।


6
সঠিক। এবং নোট করুন যে ব্যাকিংয়ের অ্যারে দীর্ঘতর হলেও সমান bb.capacity() হতে পারেbb.remaining() , তাই আপনার সঠিকতা কখন bb.array()সঠিক হবে তা পরীক্ষা হিসাবে ব্যবহার করবেন না । দেখুন ByteBuffer.slice()
cdunn2001

4
মনে রাখবেন, বাফারের অবস্থান পরিবর্তন করা এড়াতে, আমি ব্যবহার করেছি bb.slice().remaining()। আসল বাফারটি স্পর্শ না করে সেটিকে দেখে মনে হচ্ছে কোনও পরিষ্কার ডাম্প।
কিল

এই পদ্ধতিটি আমাকে স্বাক্ষরিত বাইট দেয় তবে আমি স্বাক্ষরবিহীন চাই ... কোনও ধারণা?
এইচ রাওয়াল

জাভাতে স্বাক্ষরবিহীন পূর্ণসংখ্যার ধারণা নেই, কেবলমাত্র স্বাক্ষরযুক্তগুলি। আপনি যদি "স্বাক্ষরবিহীন বাইটস" চান তবে আপনার কিছুটা মূল্য হিসাবে intবিটমাস্ক হিসাবে cast ালাই এবং ব্যবহার করতে হবে । 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"

যা আপনি যা করতে চান তা নাও হতে পারে।

আপনি যদি সত্যিই বাইট-অ্যারে অনুলিপি করতে না চান, তবে একটি কাজ চারপাশে বাইট-বাফারের অ্যারেঅফসেট () + অবশিষ্ট () ব্যবহার করা যেতে পারে, তবে এটি কেবল তখনই কাজ করে যদি অ্যাপ্লিকেশনটি বাইট-বাফারগুলির সূচি + দৈর্ঘ্য সমর্থন করে works চাহিদা.


"bb.array () বাইট-বাফার অবস্থানের সম্মান দেয় না", আপনি কি এই অংশটি সম্পর্কে আমাদের আরও বিশদ সরবরাহ করতে পারেন? আমি টুকরো টুকরো উদাহরণটি বুঝতে পেরেছি তবে কেন বিবি.আররে ()
গণ্ডগোল হয়েছে

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

এবং...? আপনি কী বলতে চাইছেন তা নিশ্চিত নয়, দুঃখিত।
টোম মাইক

প্রশ্নটি কীভাবে বাইটবফার থেকে একটি বাইটে যেতে হবে []।
পাইব

4
একবার বলা হয়ে গেলে তারা dataপরিবর্তনশীল হয়। গ্রাহক ফিরে আসেন this, এর জাভাডোকটি দেখুন।
টম মাইক

ধন্যবাদ, আমি এটি পেলাম না। যেহেতু get পদ্ধতিটি কোনও মান ফিরিয়ে দিচ্ছে, তাই এটির কোনও পার্শ্ব প্রতিক্রিয়া হবে বলেও আমি আশা করছিলাম না।
পাইব

1

এটি বাইট পাওয়ার সহজ উপায় [] তবে বাইটবফার ব্যবহারের বিষয়টির একটি অংশ বাইট তৈরি করা এড়িয়ে চলেছে []। সম্ভবত আপনি বাইট [] থেকে বাইটবফার থেকে সরাসরি যা পেতে চেয়েছিলেন তা পেতে পারেন।


15
তবে প্রায়শই আপনাকে এমন কিছু কল করতে হবে (নিজের কোডে নয়) যা বাইট নেয় [], তাই রূপান্তরকরণ বিকল্প নয়।
জেমস মুর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.