কম্পিউটার টিউটোরিয়াল

জাভাস্ক্রিপ্ট ArrayBuffer.slice() মেথড: বাইনারি ডেটা কপি করা

ArrayBuffer.slice() — বাইনারি বাফারের সাব-অ্যারে তৈরি

ArrayBuffer.prototype.slice(begin, end) একটি নতুন ArrayBuffer রিটার্ন করে যা মূল বাফারের নির্দিষ্ট বাইট রেঞ্জের কপি ধারণ করে। মূল বাফার অপরিবর্তিত থাকে।

সিনট্যাক্স

const newBuffer = buffer.slice(begin[, end])
  • begin: শুরু বাইট ইনডেক্স (০-ভিত্তিক)। নেগেটিভ হলে শেষ থেকে গণনা।
  • end (ঐচ্ছিক): শেষ বাইট ইনডেক্স (এক্সক্লूसিভ)। না দিলে বাফারের শেষ পর্যন্ত। নেগেটিভ হলে শেষ থেকে গণনা।
  • রিটার্ন: নতুন ArrayBuffer।

উদাহরণ: Int32Array ভিউ দিয়ে কাজ

// ১৬ বাইট বাফার (৪টি 32-বিট ইন্টিজার)
const buffer = new ArrayBuffer(16);
const view = new Int32Array(buffer);

view[0] = 11;  // 0x0000000B
view[1] = 22;  // 0x00000016
view[2] = 33;  // 0x00000021
view[3] = 44;  // 0x0000002C

console.log('মূল বাফার:', [...view]); // [11, 22, 33, 44]

// প্রথম ৮ বাইট (২টি Int32) কপি
const slicedBuffer = buffer.slice(0, 8);
const slicedView = new Int32Array(slicedBuffer);

console.log('স্লাইসড:', [...slicedView]); // [11, 22]

// নেগেটিভ ইনডেক্স: শেষ ৮ বাইট
const lastHalf = buffer.slice(-8);
console.log('শেষ ৮ বাইট:', [...new Int32Array(lastHalf)]); // [33, 44]

গুরুত্বপূর্ণ নোট

  • কপি হয়, রেফারেন্স নয়: স্লাইসড বাফার সম্পূর্ণ নতুন মেমরি অ্যালোকেশন। মূল বাফার পরিবর্তন করলে স্লাইসড বাফার প্রভাবিত হয় না।
  • ভিউ নেই: slice() শুধু র(raw বাইটস কপি করে। ভিউ (Int32Array, DataView ইত্যাদি) স্লাইসড বাফারের ওপর নতুন করে তৈরি করতে হয়।
  • ব্রাউজার সাপোর্ট: IE10+, সকল আধুনিক ব্রাউজার, Node.js ০.১০+।

ব্যবহারিক পরিস্থিতি

১. বাইনারি প্রোটোকল পার্সিং (নেটওয়ার্ক 패킷)

function parsePacket(buffer) {
  const header = buffer.slice(0, 4);      // প্রথম ৪ বাইট হেডার
  const payload = buffer.slice(4, -2);    // মাঝপথ (চেকসাম বাদে)
  const checksum = buffer.slice(-2);      // শেষ ২ বাইট চেকসাম
  // ...
}

২. বড় ফাইল চাঙ্কে প্রসেসিং

async function processLargeBuffer(buffer, chunkSize = 1024 * 1024) {
  for (let offset = 0; offset < buffer.byteLength; offset += chunkSize) {
    const chunk = buffer.slice(offset, offset + chunkSize);
    await processChunk(chunk);
  }
}

৩. WebGL / WebGPU বাফার আপলোড

// বড় বাফারের অংশ আপলোড
gl.bufferSubData(gl.ARRAY_BUFFER, offset, buffer.slice(offset, offset + size));

ArrayBuffer vs TypedArray.slice()

মেথডঅবজেক্টরিটার্নব্যবহার
buffer.slice()ArrayBufferArrayBufferর raw বাইট কপি
typedArray.slice()Int32Array, Uint8Array, etc.TypedArray (নতুন)এলিমেন্ট-লেভেল স্লাইস (বাইট নয়)
typedArray.subarray()TypedArrayTypedArray (ভিউ)কপি না, একই মেমরি শেয়ার (O(1))

TypedArray.subarray() — জিরো-কপি অ্যাল্টার্নেটিভ

const arr = new Uint8Array([1,2,3,4,5,6]);
const sub = arr.subarray(2, 5); // [3,4,5] — নতুন অ্যালোকেশন নেই!
sub[0] = 99;
console.log(arr); // [1,2,99,4,5,6] — মূলও পরিবর্তিত!
  • subarray() দ্রুত (O(1)), মেমরি-এফিশিয়েন্ট।
  • যদি অরিজিনাল পরিবর্তন করতে না চান, slice() বা typedArray.slice() ব্যবহার করুন।

Node.js Buffer নোট

Node.js-এ Buffer (ArrayBuffer-এর সাবক্লাস) এর slice() **রেফারেন্স রিটার্ন করে** (কপি নয়!) — এটি লিগ্যাসি আচরণ। কপি করতে buf.subarray() বা Buffer.from(buf) ব্যবহার করুন।

  1. জাভাস্ক্রিপ্ট exec() মেথড

  2. জাভাস্ক্রিপ্ট Array slice() মেথড

  3. জাভাস্ক্রিপ্ট getTime() মেথড

  4. জাভাস্ক্রিপ্ট Sort() মেথড