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() | ArrayBuffer | ArrayBuffer | র raw বাইট কপি |
typedArray.slice() | Int32Array, Uint8Array, etc. | TypedArray (নতুন) | এলিমেন্ট-লেভেল স্লাইস (বাইট নয়) |
typedArray.subarray() | TypedArray | TypedArray (ভিউ) | কপি না, একই মেমরি শেয়ার (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) ব্যবহার করুন।