Buffer.from(arrayBuffer[, byteOffset[, length]])
arrayBuffer
<ArrayBuffer> | <SharedArrayBuffer>ArrayBuffer
、SharedArrayBuffer
,例如TypedArray
的.buffer
属性。byteOffset
<integer> 要暴露的第一个字节的索引。 默认值:0
。length
<integer> 要暴露的字节数。 默认值:arrayBuffer.byteLength - byteOffset
。
这将创建 ArrayBuffer
的视图,而无需复制底层内存。
例如,当传入对 TypedArray
实例的 .buffer
属性的引用时,新创建的 Buffer
将与 TypedArray
的底层 ArrayBuffer
共享相同的分配内存。
import { Buffer } from 'node:buffer';
const arr = new Uint16Array(2);
arr[0] = 5000;
arr[1] = 4000;
// 与 `arr` 共享内存。
const buf = Buffer.from(arr.buffer);
console.log(buf);
// 打印: <Buffer 88 13 a0 0f>
// 更改原始的 Uint16Array 也会更改缓冲区。
arr[1] = 6000;
console.log(buf);
// 打印: <Buffer 88 13 70 17>
const { Buffer } = require('node:buffer');
const arr = new Uint16Array(2);
arr[0] = 5000;
arr[1] = 4000;
// 与 `arr` 共享内存。
const buf = Buffer.from(arr.buffer);
console.log(buf);
// 打印: <Buffer 88 13 a0 0f>
// 更改原始的 Uint16Array 也会更改缓冲区。
arr[1] = 6000;
console.log(buf);
// 打印: <Buffer 88 13 70 17>
可选的 byteOffset
和 length
参数指定了 arrayBuffer
中将由 Buffer
共享的内存范围。
import { Buffer } from 'node:buffer';
const ab = new ArrayBuffer(10);
const buf = Buffer.from(ab, 0, 2);
console.log(buf.length);
// 打印: 2
const { Buffer } = require('node:buffer');
const ab = new ArrayBuffer(10);
const buf = Buffer.from(ab, 0, 2);
console.log(buf.length);
// 打印: 2
如果 arrayBuffer
不是 ArrayBuffer
或 SharedArrayBuffer
或其他适用于 Buffer.from()
变体的类型,则将抛出 TypeError
。
记住,支持 ArrayBuffer
可以覆盖超出 TypedArray
视图边界的内存范围。
使用 TypedArray
的 buffer
属性创建的新 Buffer
可能会超出 TypedArray
的范围:
import { Buffer } from 'node:buffer';
const arrA = Uint8Array.from([0x63, 0x64, 0x65, 0x66]); // 4 个元素
const arrB = new Uint8Array(arrA.buffer, 1, 2); // 2 个元素
console.log(arrA.buffer === arrB.buffer); // true
const buf = Buffer.from(arrB.buffer);
console.log(buf);
// 打印: <Buffer 63 64 65 66>
const { Buffer } = require('node:buffer');
const arrA = Uint8Array.from([0x63, 0x64, 0x65, 0x66]); // 4 个元素
const arrB = new Uint8Array(arrA.buffer, 1, 2); // 2 个元素
console.log(arrA.buffer === arrB.buffer); // true
const buf = Buffer.from(arrB.buffer);
console.log(buf);
// 打印: <Buffer 63 64 65 66>
arrayBuffer
<ArrayBuffer> | <SharedArrayBuffer> AnArrayBuffer
,SharedArrayBuffer
, for example the.buffer
property of aTypedArray
.byteOffset
<integer> Index of first byte to expose. Default:0
.length
<integer> Number of bytes to expose. Default:arrayBuffer.byteLength - byteOffset
.
This creates a view of the ArrayBuffer
without copying the underlying
memory. For example, when passed a reference to the .buffer
property of a
TypedArray
instance, the newly created Buffer
will share the same
allocated memory as the TypedArray
's underlying ArrayBuffer
.
import { Buffer } from 'node:buffer';
const arr = new Uint16Array(2);
arr[0] = 5000;
arr[1] = 4000;
// Shares memory with `arr`.
const buf = Buffer.from(arr.buffer);
console.log(buf);
// Prints: <Buffer 88 13 a0 0f>
// Changing the original Uint16Array changes the Buffer also.
arr[1] = 6000;
console.log(buf);
// Prints: <Buffer 88 13 70 17>
const { Buffer } = require('node:buffer');
const arr = new Uint16Array(2);
arr[0] = 5000;
arr[1] = 4000;
// Shares memory with `arr`.
const buf = Buffer.from(arr.buffer);
console.log(buf);
// Prints: <Buffer 88 13 a0 0f>
// Changing the original Uint16Array changes the Buffer also.
arr[1] = 6000;
console.log(buf);
// Prints: <Buffer 88 13 70 17>
The optional byteOffset
and length
arguments specify a memory range within
the arrayBuffer
that will be shared by the Buffer
.
import { Buffer } from 'node:buffer';
const ab = new ArrayBuffer(10);
const buf = Buffer.from(ab, 0, 2);
console.log(buf.length);
// Prints: 2
const { Buffer } = require('node:buffer');
const ab = new ArrayBuffer(10);
const buf = Buffer.from(ab, 0, 2);
console.log(buf.length);
// Prints: 2
A TypeError
will be thrown if arrayBuffer
is not an ArrayBuffer
or a
SharedArrayBuffer
or another type appropriate for Buffer.from()
variants.
It is important to remember that a backing ArrayBuffer
can cover a range
of memory that extends beyond the bounds of a TypedArray
view. A new
Buffer
created using the buffer
property of a TypedArray
may extend
beyond the range of the TypedArray
:
import { Buffer } from 'node:buffer';
const arrA = Uint8Array.from([0x63, 0x64, 0x65, 0x66]); // 4 elements
const arrB = new Uint8Array(arrA.buffer, 1, 2); // 2 elements
console.log(arrA.buffer === arrB.buffer); // true
const buf = Buffer.from(arrB.buffer);
console.log(buf);
// Prints: <Buffer 63 64 65 66>
const { Buffer } = require('node:buffer');
const arrA = Uint8Array.from([0x63, 0x64, 0x65, 0x66]); // 4 elements
const arrB = new Uint8Array(arrA.buffer, 1, 2); // 2 elements
console.log(arrA.buffer === arrB.buffer); // true
const buf = Buffer.from(arrB.buffer);
console.log(buf);
// Prints: <Buffer 63 64 65 66>