দুটি byteঅ্যারে সংযুক্ত করার সহজ উপায় কী ?
বলুন,
byte a[];
byte b[];
আমি কীভাবে দুটি byteঅ্যারে সংযুক্ত করে এটিকে অন্য byteঅ্যারে সঞ্চয় করব?
দুটি byteঅ্যারে সংযুক্ত করার সহজ উপায় কী ?
বলুন,
byte a[];
byte b[];
আমি কীভাবে দুটি byteঅ্যারে সংযুক্ত করে এটিকে অন্য byteঅ্যারে সঞ্চয় করব?
উত্তর:
এটি করার সর্বাধিক মার্জিত উপায় হ'ল ক ByteArrayOutputStream।
byte a[];
byte b[];
ByteArrayOutputStream outputStream = new ByteArrayOutputStream( );
outputStream.write( a );
outputStream.write( b );
byte c[] = outputStream.toByteArray( );
outputStream.write( c );- আপনাকে পিছনে গিয়ে লাইনটি সম্পাদন করতে হবে না যেখানে আপনি ফলাফল বাইট অ্যারে তৈরি করেন। এছাড়াও অ্যারেকপি পদ্ধতিটি ব্যবহার না করে অ্যারেগুলিকে পুনরায় অর্ডার করা সহজ।
a.length + b.lengthতবে ByteArrayOutputStreamকনস্ট্রাক্টরের পক্ষে যুক্তি হিসাবে ব্যবহার করতে ভুলবেন না । নোট করুন যে এই পদ্ধতিটি এখনও নির্ধারণের জন্য সমস্ত বাইটগুলি একটি নতুন অ্যারেতে অনুলিপি করবে c[]! ByteBufferপদ্ধতিটি একটি ঘনিষ্ঠ প্রতিযোগী হিসাবে বিবেচনা করুন , যা স্মৃতিকে নষ্ট করে না।
পেয়ারা ব্যবহার করে একটি দুর্দান্ত সমাধান এখানে দেওয়া হয়েছে com.google.common.primitives.Bytes:
byte[] c = Bytes.concat(a, b);
এই পদ্ধতিটি সম্পর্কে দুর্দান্ত বিষয়টি হল এটিতে একটি ভারার্গস স্বাক্ষর রয়েছে:
public static byte[] concat(byte[]... arrays)
যার অর্থ আপনি একক পদ্ধতিতে কলটিতে স্বেচ্ছাসেবী সংখ্যক অ্যারে সংযুক্ত করতে পারেন।
আরেকটি সম্ভাবনা ব্যবহার করা হয় java.nio.ByteBuffer।
কিছুটা এইরকম
ByteBuffer bb = ByteBuffer.allocate(a.length + b.length + c.length);
bb.put(a);
bb.put(b);
bb.put(c);
byte[] result = bb.array();
// or using method chaining:
byte[] result = ByteBuffer
.allocate(a.length + b.length + c.length)
.put(a).put(b).put(c)
.array();
নোট করুন যে অ্যারেটি শুরু করার জন্য যথাযথ আকারের হওয়া আবশ্যক, সুতরাং বরাদ্দ রেখার প্রয়োজন ( array()কেবলমাত্র ব্যাকিং অ্যারেটি অফসেট, অবস্থান বা সীমা বিবেচনা না করেই ফেরত দেয়)।
ByteBuffer.allocate(int)একটি স্থিতিশীল পদ্ধতি যা একটি তাত্ক্ষণিক java.nio.HeapByteBuffer, একটি উপশ্রেণীর ফেরত দেয় ByteBuffer। .put()এবং .compact()পদ্ধতি - এবং অন্য কোন বিমূর্ত-অন্তরীপ - যত্ন নেওয়া হয়।
compact()লাইনটি ভুল হিসাবে এটি সরানো হয়েছে
bb.flip(); bb.get(result);স্থির করে জারি করে এটি সমাধান byte[] result = bb.array();।
allocateপদ্ধতির যত্ন সহকারে পড়া নিম্নলিখিত বিষয়গুলি প্রকাশ করে: "নতুন বাফারের অবস্থান শূন্য হবে, এর সীমা তার সক্ষমতা হবে, এর চিহ্নটি অপরিবর্তিত থাকবে এবং এর প্রতিটি উপাদান শূন্যে শুরু করা হবে will এটির একটি ব্যাকিং অ্যারে থাকবে এবং এর অ্যারে অফসেটটি শূন্য হবে। সুতরাং কোডের এই নির্দিষ্ট অংশের জন্য, যেখানে ByteBufferঅভ্যন্তরীণভাবে বরাদ্দ করা হয়, এটি কোনও সমস্যা নয়।
আরেকটি উপায় হ'ল ইউটিলিটি ফাংশনটি ব্যবহার করা (আপনি যদি এটি পছন্দ করেন তবে জেনেরিক ইউটিলিটি শ্রেণির একটি স্ট্যাটিক পদ্ধতি তৈরি করতে পারেন):
byte[] concat(byte[]...arrays)
{
// Determine the length of the result array
int totalLength = 0;
for (int i = 0; i < arrays.length; i++)
{
totalLength += arrays[i].length;
}
// create the result array
byte[] result = new byte[totalLength];
// copy the source arrays into the result array
int currentIndex = 0;
for (int i = 0; i < arrays.length; i++)
{
System.arraycopy(arrays[i], 0, result, currentIndex, arrays[i].length);
currentIndex += arrays[i].length;
}
return result;
}
পছন্দ করুন:
byte[] a;
byte[] b;
byte[] result = concat(a, b);
এটি 3, 4, 5 অ্যারে ইত্যাদির জন্যও কাজ করবে
এটি এইভাবে করা আপনাকে দ্রুত অ্যারেরকপি কোডের সুবিধা দেয় যা পড়া এবং বজায় রাখা খুব সহজ।
byte[] result = new byte[a.length + b.length];
// copy a to result
System.arraycopy(a, 0, result, 0, a.length);
// copy b to result
System.arraycopy(b, 0, result, a.length, b.length);
আপনি যদি ByteBuffer@ কালেফ্রঞ্জের মতো পছন্দ করেন তবে সর্বদা byte[]এক লাইনে দুটি (বা আরও বেশি) সংশ্লেষ করার পক্ষে সম্ভাবনা থাকে :
byte[] c = ByteBuffer.allocate(a.length+b.length).put(a).put(b).array();
আপনি ক্লিন কোডের জন্য অ্যাপাচি কমন্স ল্যাংয়ের মতো তৃতীয় পক্ষের গ্রন্থাগারগুলি ব্যবহার করতে পারেন এবং এটির মতো ব্যবহার করতে পারেন:
byte[] bytes = ArrayUtils.addAll(a, b);
ArrayUtils.addAll(a, b)এবং byte[] c = Bytes.concat(a, b), তবে আধুনিকটি আরও দ্রুত।
দুটি বা একাধিক অ্যারেগুলির জন্য, এই সাধারণ এবং পরিষ্কার ব্যবহারের পদ্ধতিটি ব্যবহার করা যেতে পারে:
/**
* Append the given byte arrays to one big array
*
* @param arrays The arrays to append
* @return The complete array containing the appended data
*/
public static final byte[] append(final byte[]... arrays) {
final ByteArrayOutputStream out = new ByteArrayOutputStream();
if (arrays != null) {
for (final byte[] array : arrays) {
if (array != null) {
out.write(array, 0, array.length);
}
}
}
return out.toByteArray();
}
আপনি যদি পিডিএফ সমন্বিত দুটি বাইট অ্যারে মার্জ করে থাকেন তবে এই যুক্তিটি কার্যকর হবে না। আমাদের অ্যাপাচি থেকে পিডিএফক্সবক্সের মতো একটি তৃতীয় পক্ষের সরঞ্জাম ব্যবহার করতে হবে:
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
mergePdf.addSource(new ByteArrayInputStream(a));
mergePdf.addSource(new ByteArrayInputStream(b));
mergePdf.setDestinationStream(byteArrayOutputStream);
mergePdf.mergeDocuments();
c = byteArrayOutputStream.toByteArray();
আপনি যদি অ্যারের আকারগুলিতে গণ্ডগোল করতে না চান তবে কেবল স্ট্রিং কনটেনটেশনের যাদুটি ব্যবহার করুন:
byte[] c = (new String(a, "l1") + new String(b, "l1")).getBytes("l1");
অথবা আপনার কোডের কোথাও সংজ্ঞা দিন
// concatenation charset
static final java.nio.charset.Charset cch = java.nio.charset.StandardCharsets.ISO_8859_1;
আর ব্যবহার করুন
byte[] c = (new String(a, cch) + new String(b, cch)).getBytes(cch);
এটি অবশ্যই +সংযোজন অপারেটরটি ব্যবহার করে দুটিরও বেশি স্ট্রিং কনটেনটেশন দিয়ে কাজ করে ।
উভয়ই "l1"এবং ISO_8859_1পশ্চিমা লাতিন ১ টি অক্ষর সেটটি নির্দেশ করে যা প্রতিটি অক্ষরকে একক বাইট হিসাবে এনকোড করে। যেহেতু কোনও বহু-বাইট অনুবাদ সম্পাদিত হয় না স্ট্রিংয়ের অক্ষরগুলির বাইটগুলির সমান মান থাকবে (এ ছাড়া তারা সর্বদা ইতিবাচক মান হিসাবে ব্যাখ্যা করা হবে, charস্বাক্ষরবিহীন)। কমপক্ষে ওরাকল প্রদত্ত রানটাইমের জন্য, যে কোনও বাইট সঠিকভাবে "ডিকোডড" হবে এবং তারপরে আবার "এনকোডড" হবে।
সতর্কতা অবলম্বন করুন যে স্ট্রিংগুলি বাইট অ্যারেটি যথেষ্ট পরিমাণে বাড়িয়েছে, অতিরিক্ত মেমরির প্রয়োজন। স্ট্রিংগুলি অভ্যন্তরীণও করা যেতে পারে এবং অতএব সরানো সহজ হবে না। স্ট্রিংগুলিও অপরিবর্তনীয়, তাই তাদের ভিতরে থাকা মানগুলি ধ্বংস করা যায় না। সুতরাং আপনার সংবেদনশীল অ্যারেগুলি এইভাবে জড়িত করা উচিত নয় বা বৃহত্তর বাইট অ্যারেগুলির জন্য আপনার এই পদ্ধতিটি ব্যবহার করা উচিত নয়। আপনি যা করছেন তার একটি স্পষ্ট ইঙ্গিত দেওয়াও প্রয়োজন হবে, কারণ অ্যারে কনটেন্টেশন করার এই পদ্ধতিটি সাধারণ সমাধান নয়।
এটি করার আমার উপায়!
public static byte[] concatByteArrays(byte[]... inputs) {
int i = inputs.length - 1, len = 0;
for (; i >= 0; i--) {
len += inputs[i].length;
}
byte[] r = new byte[len];
for (i = inputs.length - 1; i >= 0; i--) {
System.arraycopy(inputs[i], 0, r, len -= inputs[i].length, inputs[i].length);
}
return r;
}
বৈশিষ্ট্য :
...কোনও সংখ্যক বাইটের সাথে কল করতে ভারার্গস ( ) ব্যবহার করুন []।System.arraycopy()উচ্চ গতির অপারেশন নিশ্চিত করতে যে মেশিন নির্দিষ্ট নেটিভ কোড সঙ্গে বাস্তবায়িত হয়।intপুনঃব্যবহার দ্বারা ভেরিয়েবল iএবং lenভেরিয়েবল।মনে রাখবেন :
এটি করার সর্বোত্তম উপায় হ'ল @ জোনাথন কোডটি অনুলিপি করুন । সমস্যাটি নেটিভ ভেরিয়েবল অ্যারে থেকে আসে কারণ জাভা নতুন ভেরিয়েবল তৈরি করে যখন এই ডেটা টাইপ অন্য ফাংশনে প্রেরণ করা হয়।
System.arrayCopy,ByteBufferএবং - এত দক্ষ নয় তবে পাঠযোগ্য -ByteArrayOutputStreamসবগুলি কভার করা হয়েছে। আমরা এখানে দেওয়া উত্তরের 7 টিরও বেশি ডুপস পেয়েছি। দয়া করে আর কোনও ডুপ পোস্ট করবেন না।