Trong Node.js, Buffer là lớp xử lý dữ liệu nhị phân. Để chuyển sang ArrayBuffer (chuẩn Web API), có nhiều cách tùy phiên bản Node.
Cách 1: Node.js 4.x+ (Buffer extends Uint8Array)
Buffer kế thừa từ Uint8Array, có property .buffer trả về ArrayBuffer chung (shared memory – zero-copy):
const buf = Buffer.from('Hello World');
const arrayBuffer = buf.buffer; // Shared ArrayBuffer
console.log(arrayBuffer.byteLength); // 11
Lưu ý: buf.buffer là buffer của toàn bộ Uint8Array backing store, có thể lớn hơn buf.length nếu Buffer là slice. An toàn hơn dùng cách 2.
Cách 2: Tạo ArrayBuffer mới (copy) – An toàn mọi phiên bản
function toArrayBuffer(buf) {
const arrayBuffer = new ArrayBuffer(buf.length);
const view = new Uint8Array(arrayBuffer);
for (let i = 0; i < buf.length; i++) {
view[i] = buf[i];
}
return arrayBuffer;
}
// Hoặc dùng Buffer.copy (nhanh hơn)
function toArrayBufferFast(buf) {
const arrayBuffer = new ArrayBuffer(buf.length);
new Uint8Array(arrayBuffer).set(buf);
return arrayBuffer;
}
Cách 3: Node.js 16.17+ / 18+ – buffer.transferToArrayBuffer()
const buf = Buffer.from('Hello');
const arrayBuffer = buf.transferToArrayBuffer(); // Zero-copy, buf bị "neutered" (không dùng được nữa)
console.log(buf.length); // 0
Tóm tắt khuyến nghị
| Phiên bản Node | Khuyến nghị |
|---|---|
| Tất cả | new Uint8Array(buf).buffer (copy) hoặc Uint8Array.from(buf).buffer |
| ≥ 4.x | buf.buffer (shared – cẩn thận slice) |
| ≥ 16.17 / 18 | buf.transferToArrayBuffer() (zero-copy, chuyển quyền sở hữu) |