Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> JavaScript

Cách chuyển đổi Buffer nhị phân Node.js sang JavaScript ArrayBuffer

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 NodeKhuyến nghị
Tất cảnew Uint8Array(buf).buffer (copy) hoặc Uint8Array.from(buf).buffer
≥ 4.xbuf.buffer (shared – cẩn thận slice)
≥ 16.17 / 18buf.transferToArrayBuffer() (zero-copy, chuyển quyền sở hữu)