কিভাবে ArrayBuffer স্ট্রিং থেকে এবং থেকে রূপান্তর করতে হয়

ArrayBuffers কাঁচা ডেটা পরিবহনের জন্য ব্যবহার করা হয় এবং WebSockets , Web Intents 2](https://www.html5rocks.com/en/tutorials/file/xhr2/) এবং WebWorkers সহ বেশ কিছু নতুন API তাদের উপর নির্ভর করে। যাইহোক, যেহেতু তারা সম্প্রতি জাভাস্ক্রিপ্ট জগতে এসেছে, কখনও কখনও তাদের ভুল ব্যাখ্যা বা অপব্যবহার করা হয়।

শব্দার্থগতভাবে, একটি ArrayBuffer একটি নির্দিষ্ট মুখোশের মাধ্যমে দেখা বাইটগুলির একটি অ্যারে। এই মুখোশ, ArrayBufferView এর একটি উদাহরণ, বিষয়বস্তুর প্রত্যাশিত কাঠামোর সাথে মেলে কীভাবে বাইটগুলি সারিবদ্ধ করা হয় তা সংজ্ঞায়িত করে। উদাহরণস্বরূপ, যদি আপনি জানেন যে একটি ArrayBuffer-এর বাইটগুলি 16-বিট স্বাক্ষরবিহীন পূর্ণসংখ্যাগুলির একটি অ্যারের প্রতিনিধিত্ব করে, আপনি কেবল ArrayBufferটিকে একটি Uint16Array ভিউতে মোড়ানো এবং আপনি বন্ধনী সিনট্যাক্স ব্যবহার করে এর উপাদানগুলিকে ম্যানিপুলেট করতে পারেন যেন Uint16Array একটি পূর্ণসংখ্যা অ্যারে ছিল:

// suppose buf contains the bytes [0x02, 0x01, 0x03, 0x07]
// notice the multibyte values respect the hardware endianess, which is little-endian in x86
var bufView = new Uint16Array(buf);
if (bufView[0]===258) {   // 258 === 0x0102
    console.log("ok");
}
bufView[0] = 255;    // buf now contains the bytes [0xFF, 0x00, 0x03, 0x07]
bufView[0] = 0xff05; // buf now contains the bytes [0x05, 0xFF, 0x03, 0x07]
bufView[1] = 0x0210; // buf now contains the bytes [0x05, 0xFF, 0x10, 0x02]

ArrayBuffer সম্পর্কে একটি সাধারণ ব্যবহারিক প্রশ্ন হল কিভাবে একটি String ArrayBuffer এ রূপান্তর করা যায় এবং এর বিপরীতে। যেহেতু একটি ArrayBuffer প্রকৃতপক্ষে একটি বাইট অ্যারে, এই রূপান্তরের জন্য উভয় প্রান্তই সম্মত হতে হবে যে কীভাবে স্ট্রিং-এর অক্ষরগুলিকে বাইট হিসাবে উপস্থাপন করা যায়। আপনি সম্ভবত এই "চুক্তি" আগে দেখেছেন: এটি স্ট্রিং এর অক্ষর এনকোডিং (এবং সাধারণ "চুক্তির শর্তাবলী" হল, উদাহরণস্বরূপ, ইউনিকোড UTF-16 এবং iso8859-1)। সুতরাং, ধরুন আপনি এবং অন্য পক্ষ UTF-16 এনকোডিং-এ সম্মত হয়েছেন, রূপান্তর কোডটি এরকম কিছু হতে পারে:

function ab2str(buf) {
    return String.fromCharCode.apply(null, new Uint16Array(buf));
}
function str2ab(str) {
    var buf = new ArrayBuffer(str.length*2); // 2 bytes for each char
    var bufView = new Uint16Array(buf);
    for (var i=0, strLen=str.length; i < strLen; i++) {
    bufView[i] = str.charCodeAt(i);
    }
    return buf;
}

Uint16Array এর ব্যবহার নোট করুন। এটি একটি ArrayBuffer ভিউ যা ArrayBuffers-এর বাইটকে 16-বিট উপাদান হিসেবে সারিবদ্ধ করে। এটি অক্ষর এনকোডিং নিজেই পরিচালনা করে না, যা String.fromCharCode এবং str.charCodeAt দ্বারা ইউনিকোড হিসাবে পরিচালনা করা হয়।

এই সম্পর্কে একটি জনপ্রিয় স্ট্যাকওভারফ্লো প্রশ্নে একটি উচ্চ ভোট দেওয়া উত্তর রয়েছে যার একটি রূপান্তরের কিছুটা জটিল সমাধান রয়েছে: একটি রূপান্তরকারী হিসাবে কাজ করার জন্য একটি FileReader তৈরি করুন এবং এতে স্ট্রিং ধারণকারী একটি Blob ফিড করুন৷ যদিও এই পদ্ধতিটি কাজ করে, এটির দরিদ্র পঠনযোগ্যতা রয়েছে এবং আমি সন্দেহ করি এটি ধীর। যেহেতু ভিত্তিহীন সন্দেহ মানবতার ইতিহাসে অনেক ভুলকে চালিত করেছে, আসুন এখানে আরও বৈজ্ঞানিক পদ্ধতি গ্রহণ করা যাক। আমি দুটি পদ্ধতি jsperf'ed করেছি এবং ফলাফলটি আমার সন্দেহ নিশ্চিত করে এবং আপনি এখানে ডেমোটি পরীক্ষা করে দেখুন

Chrome 20-এ, FileReader / Blob পদ্ধতি ব্যবহার করার চেয়ে এই নিবন্ধে সরাসরি ArrayBuffer ম্যানিপুলেশন কোড ব্যবহার করা প্রায় 27 গুণ দ্রুত।