Buffer#

稳定性: 2 - 稳定

源代码: lib/buffer.js

Buffer 对象用于表示固定长度的字节序列。许多 Node.js API 支持 Buffer

Buffer 类是 JavaScript 的 Uint8Array 类的子类,并扩展了它,其中包含涵盖更多用例的方法。Node.js API 接受纯 Uint8Array,只要支持 Buffer

虽然 Buffer 类在全局范围内可用,但仍然建议通过导入或 require 语句显式引用它。

import { Buffer } from 'node:buffer';

// Creates a zero-filled Buffer of length 10.
const buf1 = Buffer.alloc(10);

// Creates a Buffer of length 10,
// filled with bytes which all have the value `1`.
const buf2 = Buffer.alloc(10, 1);

// Creates an uninitialized buffer of length 10.
// This is faster than calling Buffer.alloc() but the returned
// Buffer instance might contain old data that needs to be
// overwritten using fill(), write(), or other functions that fill the Buffer's
// contents.
const buf3 = Buffer.allocUnsafe(10);

// Creates a Buffer containing the bytes [1, 2, 3].
const buf4 = Buffer.from([1, 2, 3]);

// Creates a Buffer containing the bytes [1, 1, 1, 1] – the entries
// are all truncated using `(value & 255)` to fit into the range 0–255.
const buf5 = Buffer.from([257, 257.5, -255, '1']);

// Creates a Buffer containing the UTF-8-encoded bytes for the string 'tést':
// [0x74, 0xc3, 0xa9, 0x73, 0x74] (in hexadecimal notation)
// [116, 195, 169, 115, 116] (in decimal notation)
const buf6 = Buffer.from('tést');

// Creates a Buffer containing the Latin-1 bytes [0x74, 0xe9, 0x73, 0x74].
const buf7 = Buffer.from('tést', 'latin1');const { Buffer } = require('node:buffer');

// Creates a zero-filled Buffer of length 10.
const buf1 = Buffer.alloc(10);

// Creates a Buffer of length 10,
// filled with bytes which all have the value `1`.
const buf2 = Buffer.alloc(10, 1);

// Creates an uninitialized buffer of length 10.
// This is faster than calling Buffer.alloc() but the returned
// Buffer instance might contain old data that needs to be
// overwritten using fill(), write(), or other functions that fill the Buffer's
// contents.
const buf3 = Buffer.allocUnsafe(10);

// Creates a Buffer containing the bytes [1, 2, 3].
const buf4 = Buffer.from([1, 2, 3]);

// Creates a Buffer containing the bytes [1, 1, 1, 1] – the entries
// are all truncated using `(value & 255)` to fit into the range 0–255.
const buf5 = Buffer.from([257, 257.5, -255, '1']);

// Creates a Buffer containing the UTF-8-encoded bytes for the string 'tést':
// [0x74, 0xc3, 0xa9, 0x73, 0x74] (in hexadecimal notation)
// [116, 195, 169, 115, 116] (in decimal notation)
const buf6 = Buffer.from('tést');

// Creates a Buffer containing the Latin-1 bytes [0x74, 0xe9, 0x73, 0x74].
const buf7 = Buffer.from('tést', 'latin1');

缓冲区和字符编码#

Buffer 和字符串之间转换时,可以指定字符编码。如果没有指定字符编码,则默认使用 UTF-8。

import { Buffer } from 'node:buffer';

const buf = Buffer.from('hello world', 'utf8');

console.log(buf.toString('hex'));
// Prints: 68656c6c6f20776f726c64
console.log(buf.toString('base64'));
// Prints: aGVsbG8gd29ybGQ=

console.log(Buffer.from('fhqwhgads', 'utf8'));
// Prints: <Buffer 66 68 71 77 68 67 61 64 73>
console.log(Buffer.from('fhqwhgads', 'utf16le'));
// Prints: <Buffer 66 00 68 00 71 00 77 00 68 00 67 00 61 00 64 00 73 00>const { Buffer } = require('node:buffer');

const buf = Buffer.from('hello world', 'utf8');

console.log(buf.toString('hex'));
// Prints: 68656c6c6f20776f726c64
console.log(buf.toString('base64'));
// Prints: aGVsbG8gd29ybGQ=

console.log(Buffer.from('fhqwhgads', 'utf8'));
// Prints: <Buffer 66 68 71 77 68 67 61 64 73>
console.log(Buffer.from('fhqwhgads', 'utf16le'));
// Prints: <Buffer 66 00 68 00 71 00 77 00 68 00 67 00 61 00 64 00 73 00>

Node.js 缓冲区接受它们接收到的所有编码字符串的大小写变体。例如,UTF-8 可以指定为 'utf8''UTF8''uTf8'

Node.js 当前支持的字符编码如下:

  • 'utf8'(别名:'utf-8'):多字节编码的 Unicode 字符。许多网页和其他文档格式使用 UTF-8。这是默认字符编码。当将 Buffer 解码为不完全包含有效 UTF-8 数据的字符串时,Unicode 替换字符 U+FFFD � 将用于表示这些错误。

  • 'utf16le'(别名:'utf-16le'):多字节编码的 Unicode 字符。与 'utf8' 不同,字符串中的每个字符都将使用 2 或 4 个字节进行编码。Node.js 仅支持 小端 变体的 UTF-16

  • 'latin1':Latin-1 代表 ISO-8859-1。此字符编码仅支持从 U+0000U+00FF 的 Unicode 字符。每个字符都使用单个字节进行编码。不适合该范围的字符将被截断,并将映射到该范围内的字符。

使用上述方法之一将 Buffer 转换为字符串称为解码,将字符串转换为 Buffer 称为编码。

Node.js 还支持以下二进制到文本编码。对于二进制到文本编码,命名约定相反:将 Buffer 转换为字符串通常称为编码,将字符串转换为 Buffer 称为解码。

  • 'base64'Base64 编码。当从字符串创建 Buffer 时,此编码还将正确接受 RFC 4648,第 5 节 中指定的“URL 和文件名安全字母”。包含在 base64 编码字符串中的空格、制表符和换行符等空白字符将被忽略。

  • 'base64url'base64url 编码,如 RFC 4648,第 5 节 中所述。当从字符串创建 Buffer 时,此编码还将正确接受常规 base64 编码字符串。当将 Buffer 编码为字符串时,此编码将省略填充。

  • 'hex': 将每个字节编码为两个十六进制字符。当解码的字符串不完全由偶数个十六进制字符组成时,可能会发生数据截断。请参见下面的示例。

还支持以下传统字符编码

  • 'ascii': 仅适用于 7 位 ASCII 数据。当将字符串编码为 Buffer 时,这等效于使用 'latin1'。当将 Buffer 解码为字符串时,使用此编码将在解码为 'latin1' 之前,另外取消设置每个字节的最高位。通常,没有理由使用此编码,因为 'utf8'(或者,如果数据已知始终为 ASCII 仅,则为 'latin1')在编码或解码 ASCII 仅文本时将是更好的选择。它仅出于向后兼容性而提供。

  • 'binary': 'latin1' 的别名。此编码的名称可能非常具有误导性,因为此处列出的所有编码都在字符串和二进制数据之间进行转换。对于在字符串和 Buffer 之间进行转换,通常 'utf8' 是正确选择。

  • 'ucs2', 'ucs-2': 'utf16le' 的别名。UCS-2 用于指代 UTF-16 的变体,该变体不支持代码点大于 U+FFFF 的字符。在 Node.js 中,始终支持这些代码点。

import { Buffer } from 'node:buffer';

Buffer.from('1ag123', 'hex');
// Prints <Buffer 1a>, data truncated when first non-hexadecimal value
// ('g') encountered.

Buffer.from('1a7', 'hex');
// Prints <Buffer 1a>, data truncated when data ends in single digit ('7').

Buffer.from('1634', 'hex');
// Prints <Buffer 16 34>, all data represented.const { Buffer } = require('node:buffer');

Buffer.from('1ag123', 'hex');
// Prints <Buffer 1a>, data truncated when first non-hexadecimal value
// ('g') encountered.

Buffer.from('1a7', 'hex');
// Prints <Buffer 1a>, data truncated when data ends in single digit ('7').

Buffer.from('1634', 'hex');
// Prints <Buffer 16 34>, all data represented.

现代 Web 浏览器遵循 WHATWG 编码标准,该标准将 'latin1''ISO-8859-1' 都别名为 'win-1252'。这意味着,在执行类似 http.get() 的操作时,如果返回的字符集是 WHATWG 规范中列出的字符集之一,则服务器实际上可能返回了 'win-1252' 编码的数据,并且使用 'latin1' 编码可能会错误地解码字符。

缓冲区和类型化数组#

Buffer 实例也是 JavaScript Uint8ArrayTypedArray 实例。所有 TypedArray 方法都可以在 Buffer 上使用。但是,Buffer API 和 TypedArray API 之间存在细微的不兼容性。

特别是

有两种方法可以从 Buffer 创建新的 TypedArray 实例。

  • Buffer 传递给 TypedArray 构造函数将复制 Buffer 的内容,解释为整数数组,而不是目标类型的字节序列。
import { Buffer } from 'node:buffer';

const buf = Buffer.from([1, 2, 3, 4]);
const uint32array = new Uint32Array(buf);

console.log(uint32array);

// Prints: Uint32Array(4) [ 1, 2, 3, 4 ]const { Buffer } = require('node:buffer');

const buf = Buffer.from([1, 2, 3, 4]);
const uint32array = new Uint32Array(buf);

console.log(uint32array);

// Prints: Uint32Array(4) [ 1, 2, 3, 4 ]
import { Buffer } from 'node:buffer';

const buf = Buffer.from('hello', 'utf16le');
const uint16array = new Uint16Array(
  buf.buffer,
  buf.byteOffset,
  buf.length / Uint16Array.BYTES_PER_ELEMENT);

console.log(uint16array);

// Prints: Uint16Array(5) [ 104, 101, 108, 108, 111 ]const { Buffer } = require('node:buffer');

const buf = Buffer.from('hello', 'utf16le');
const uint16array = new Uint16Array(
  buf.buffer,
  buf.byteOffset,
  buf.length / Uint16Array.BYTES_PER_ELEMENT);

console.log(uint16array);

// Prints: Uint16Array(5) [ 104, 101, 108, 108, 111 ]

可以通过使用 TypedArray 对象的 .buffer 属性以相同的方式,创建一个与 TypedArray 实例共享相同分配内存的新 BufferBuffer.from() 在这种情况下表现得像 new Uint8Array()

import { Buffer } from 'node:buffer';

const arr = new Uint16Array(2);

arr[0] = 5000;
arr[1] = 4000;

// Copies the contents of `arr`.
const buf1 = Buffer.from(arr);

// Shares memory with `arr`.
const buf2 = Buffer.from(arr.buffer);

console.log(buf1);
// Prints: <Buffer 88 a0>
console.log(buf2);
// Prints: <Buffer 88 13 a0 0f>

arr[1] = 6000;

console.log(buf1);
// Prints: <Buffer 88 a0>
console.log(buf2);
// Prints: <Buffer 88 13 70 17>const { Buffer } = require('node:buffer');

const arr = new Uint16Array(2);

arr[0] = 5000;
arr[1] = 4000;

// Copies the contents of `arr`.
const buf1 = Buffer.from(arr);

// Shares memory with `arr`.
const buf2 = Buffer.from(arr.buffer);

console.log(buf1);
// Prints: <Buffer 88 a0>
console.log(buf2);
// Prints: <Buffer 88 13 a0 0f>

arr[1] = 6000;

console.log(buf1);
// Prints: <Buffer 88 a0>
console.log(buf2);
// Prints: <Buffer 88 13 70 17>

当使用 TypedArray.buffer 创建 Buffer 时,可以通过传递 byteOffsetlength 参数,仅使用底层 ArrayBuffer 的一部分。

import { Buffer } from 'node:buffer';

const arr = new Uint16Array(20);
const buf = Buffer.from(arr.buffer, 0, 16);

console.log(buf.length);
// Prints: 16const { Buffer } = require('node:buffer');

const arr = new Uint16Array(20);
const buf = Buffer.from(arr.buffer, 0, 16);

console.log(buf.length);
// Prints: 16

Buffer.from()TypedArray.from() 具有不同的签名和实现。具体来说,TypedArray 变体接受第二个参数,该参数是一个映射函数,该函数在类型化数组的每个元素上调用。

  • TypedArray.from(source[, mapFn[, thisArg]])

但是,Buffer.from() 方法不支持使用映射函数。

缓冲区和迭代#

可以使用 for..of 语法迭代 Buffer 实例。

import { Buffer } from 'node:buffer';

const buf = Buffer.from([1, 2, 3]);

for (const b of buf) {
  console.log(b);
}
// Prints:
//   1
//   2
//   3const { Buffer } = require('node:buffer');

const buf = Buffer.from([1, 2, 3]);

for (const b of buf) {
  console.log(b);
}
// Prints:
//   1
//   2
//   3

此外,可以使用 buf.values()buf.keys()buf.entries() 方法创建迭代器。

类:Blob#

Blob 封装了不可变的原始数据,可以在多个工作线程之间安全共享。

new buffer.Blob([sources[, options]])#

创建一个新的 Blob 对象,其中包含给定源的串联。

<ArrayBuffer><TypedArray><DataView><Buffer> 源被复制到 'Blob' 中,因此可以在创建 'Blob' 后安全地修改它们。

字符串源被编码为 UTF-8 字节序列并复制到 Blob 中。每个字符串部分中不匹配的代理对将被替换为 Unicode U+FFFD 替换字符。

blob.arrayBuffer()#

返回一个 Promise,该 Promise 将使用包含 Blob 数据副本的 <ArrayBuffer> 完成。

blob.size#

Blob 的总大小(以字节为单位)。

blob.slice([start[, end[, type]]])#

创建并返回一个新的 Blob,其中包含此 Blob 对象数据的子集。原始 Blob 不会被更改。

blob.stream()#

返回一个新的 ReadableStream,允许读取 Blob 的内容。

blob.text()#

返回一个 Promise,该 Promise 将使用 Blob 的内容(以 UTF-8 字符串解码)完成。

blob.type#

Blob 的内容类型。

Blob 对象和 MessageChannel#

创建 <Blob> 对象后,可以通过 MessagePort 将其发送到多个目标,而无需传输或立即复制数据。只有在调用 arrayBuffer()text() 方法时才会复制 Blob 中包含的数据。

import { Blob } from 'node:buffer';
import { setTimeout as delay } from 'node:timers/promises';

const blob = new Blob(['hello there']);

const mc1 = new MessageChannel();
const mc2 = new MessageChannel();

mc1.port1.onmessage = async ({ data }) => {
  console.log(await data.arrayBuffer());
  mc1.port1.close();
};

mc2.port1.onmessage = async ({ data }) => {
  await delay(1000);
  console.log(await data.arrayBuffer());
  mc2.port1.close();
};

mc1.port2.postMessage(blob);
mc2.port2.postMessage(blob);

// The Blob is still usable after posting.
blob.text().then(console.log);const { Blob } = require('node:buffer');
const { setTimeout: delay } = require('node:timers/promises');

const blob = new Blob(['hello there']);

const mc1 = new MessageChannel();
const mc2 = new MessageChannel();

mc1.port1.onmessage = async ({ data }) => {
  console.log(await data.arrayBuffer());
  mc1.port1.close();
};

mc2.port1.onmessage = async ({ data }) => {
  await delay(1000);
  console.log(await data.arrayBuffer());
  mc2.port1.close();
};

mc1.port2.postMessage(blob);
mc2.port2.postMessage(blob);

// The Blob is still usable after posting.
blob.text().then(console.log);

类:Buffer#

Buffer 类是一个用于直接处理二进制数据的全局类型。它可以通过多种方式构造。

静态方法:Buffer.alloc(size[, fill[, encoding]])#

分配一个大小为 size 字节的新 Buffer。如果 fill 未定义,则 Buffer 将被填充为零。

import { Buffer } from 'node:buffer';

const buf = Buffer.alloc(5);

console.log(buf);
// Prints: <Buffer 00 00 00 00 00>const { Buffer } = require('node:buffer');

const buf = Buffer.alloc(5);

console.log(buf);
// Prints: <Buffer 00 00 00 00 00>

如果 size 大于 buffer.constants.MAX_LENGTH 或小于 0,则会抛出 ERR_OUT_OF_RANGE

如果指定了 fill,则分配的 Buffer 将通过调用 buf.fill(fill) 初始化。

import { Buffer } from 'node:buffer';

const buf = Buffer.alloc(5, 'a');

console.log(buf);
// Prints: <Buffer 61 61 61 61 61>const { Buffer } = require('node:buffer');

const buf = Buffer.alloc(5, 'a');

console.log(buf);
// Prints: <Buffer 61 61 61 61 61>

如果同时指定了 fillencoding,则分配的 Buffer 将通过调用 buf.fill(fill, encoding) 初始化。

import { Buffer } from 'node:buffer';

const buf = Buffer.alloc(11, 'aGVsbG8gd29ybGQ=', 'base64');

console.log(buf);
// Prints: <Buffer 68 65 6c 6c 6f 20 77 6f 72 6c 64>const { Buffer } = require('node:buffer');

const buf = Buffer.alloc(11, 'aGVsbG8gd29ybGQ=', 'base64');

console.log(buf);
// Prints: <Buffer 68 65 6c 6c 6f 20 77 6f 72 6c 64>

调用 Buffer.alloc() 可能比替代方法 Buffer.allocUnsafe() 慢,但它确保新创建的 Buffer 实例内容永远不会包含来自先前分配的敏感数据,包括可能未分配给 Buffer 的数据。

如果 size 不是数字,则会抛出 TypeError

静态方法:Buffer.allocUnsafe(size)#

  • size <整数>Buffer 的所需长度。

分配一个新的 Buffer,大小为 size 字节。如果 size 大于 buffer.constants.MAX_LENGTH 或小于 0,则会抛出 ERR_OUT_OF_RANGE 错误。

以这种方式创建的 Buffer 实例的底层内存未初始化。新创建的 Buffer 的内容未知,可能包含敏感数据。使用 Buffer.alloc() 来用零初始化 Buffer 实例。

import { Buffer } from 'node:buffer';

const buf = Buffer.allocUnsafe(10);

console.log(buf);
// Prints (contents may vary): <Buffer a0 8b 28 3f 01 00 00 00 50 32>

buf.fill(0);

console.log(buf);
// Prints: <Buffer 00 00 00 00 00 00 00 00 00 00>const { Buffer } = require('node:buffer');

const buf = Buffer.allocUnsafe(10);

console.log(buf);
// Prints (contents may vary): <Buffer a0 8b 28 3f 01 00 00 00 50 32>

buf.fill(0);

console.log(buf);
// Prints: <Buffer 00 00 00 00 00 00 00 00 00 00>

如果 size 不是数字,则会抛出 TypeError

Buffer 模块预先分配了一个大小为 Buffer.poolSize 的内部 Buffer 实例,用作池,用于快速分配使用 Buffer.allocUnsafe()Buffer.from(array)Buffer.concat() 创建的新 Buffer 实例,前提是 size 小于 Buffer.poolSize >>> 1Buffer.poolSize 除以二的向下取整)。

使用这个预先分配的内部内存池是调用 Buffer.alloc(size, fill)Buffer.allocUnsafe(size).fill(fill) 之间的关键区别。具体来说,Buffer.alloc(size, fill) 永远不会使用内部 Buffer 池,而 Buffer.allocUnsafe(size).fill(fill) 使用内部 Buffer 池,前提是 size 小于或等于 Buffer.poolSize 的一半。这种差异很细微,但在应用程序需要 Buffer.allocUnsafe() 提供的额外性能时可能很重要。

静态方法:Buffer.allocUnsafeSlow(size)#

  • size <整数>Buffer 的所需长度。

分配一个新的 Buffer,大小为 size 字节。如果 size 大于 buffer.constants.MAX_LENGTH 或小于 0,则会抛出 ERR_OUT_OF_RANGE 错误。如果 size 为 0,则会创建一个零长度的 Buffer

以这种方式创建的 Buffer 实例的底层内存未初始化。新创建的 Buffer 的内容未知,可能包含敏感数据。使用 buf.fill(0) 来用零初始化此类 Buffer 实例。

当使用 Buffer.allocUnsafe() 分配新的 Buffer 实例时,小于 4 KiB 的分配将从单个预先分配的 Buffer 中切片。这允许应用程序避免创建许多单独分配的 Buffer 实例带来的垃圾回收开销。这种方法通过消除跟踪和清理许多单独的 ArrayBuffer 对象的需要,提高了性能和内存使用率。

但是,如果开发人员需要从池中保留一小块内存以供不确定的时间使用,则可以使用 Buffer.allocUnsafeSlow() 创建一个非池化的 Buffer 实例,然后复制出相关的位。

import { Buffer } from 'node:buffer';

// Need to keep around a few small chunks of memory.
const store = [];

socket.on('readable', () => {
  let data;
  while (null !== (data = readable.read())) {
    // Allocate for retained data.
    const sb = Buffer.allocUnsafeSlow(10);

    // Copy the data into the new allocation.
    data.copy(sb, 0, 0, 10);

    store.push(sb);
  }
});const { Buffer } = require('node:buffer');

// Need to keep around a few small chunks of memory.
const store = [];

socket.on('readable', () => {
  let data;
  while (null !== (data = readable.read())) {
    // Allocate for retained data.
    const sb = Buffer.allocUnsafeSlow(10);

    // Copy the data into the new allocation.
    data.copy(sb, 0, 0, 10);

    store.push(sb);
  }
});

如果 size 不是数字,则会抛出 TypeError

静态方法:Buffer.byteLength(string[, encoding])#

返回使用 encoding 编码的字符串的字节长度。这与 String.prototype.length 不同,后者不考虑用于将字符串转换为字节的编码。

对于 'base64''base64url''hex',此函数假设输入有效。对于包含非 base64/hex 编码数据(例如空格)的字符串,返回值可能大于从字符串创建的 Buffer 的长度。

import { Buffer } from 'node:buffer';

const str = '\u00bd + \u00bc = \u00be';

console.log(`${str}: ${str.length} characters, ` +
            `${Buffer.byteLength(str, 'utf8')} bytes`);
// Prints: ½ + ¼ = ¾: 9 characters, 12 bytesconst { Buffer } = require('node:buffer');

const str = '\u00bd + \u00bc = \u00be';

console.log(`${str}: ${str.length} characters, ` +
            `${Buffer.byteLength(str, 'utf8')} bytes`);
// Prints: ½ + ¼ = ¾: 9 characters, 12 bytes

string 是一个 Buffer/DataView/TypedArray/ArrayBuffer/ SharedArrayBuffer 时,将返回由 .byteLength 报告的字节长度。

静态方法:Buffer.compare(buf1, buf2)#

buf1buf2 进行比较,通常用于对 Buffer 实例数组进行排序。这等效于调用 buf1.compare(buf2)

import { Buffer } from 'node:buffer';

const buf1 = Buffer.from('1234');
const buf2 = Buffer.from('0123');
const arr = [buf1, buf2];

console.log(arr.sort(Buffer.compare));
// Prints: [ <Buffer 30 31 32 33>, <Buffer 31 32 33 34> ]
// (This result is equal to: [buf2, buf1].)const { Buffer } = require('node:buffer');

const buf1 = Buffer.from('1234');
const buf2 = Buffer.from('0123');
const arr = [buf1, buf2];

console.log(arr.sort(Buffer.compare));
// Prints: [ <Buffer 30 31 32 33>, <Buffer 31 32 33 34> ]
// (This result is equal to: [buf2, buf1].)

静态方法:Buffer.concat(list[, totalLength])#

返回一个新的 Buffer,它是将 list 中所有 Buffer 实例连接在一起的结果。

如果列表没有项目,或者 totalLength 为 0,则返回一个新的零长度 Buffer

如果未提供totalLength,则通过将list中的Buffer实例的长度相加来计算它。

如果提供了totalLength,则将其强制转换为无符号整数。如果listBuffer的总长度超过totalLength,则结果将被截断为totalLength

import { Buffer } from 'node:buffer';

// Create a single `Buffer` from a list of three `Buffer` instances.

const buf1 = Buffer.alloc(10);
const buf2 = Buffer.alloc(14);
const buf3 = Buffer.alloc(18);
const totalLength = buf1.length + buf2.length + buf3.length;

console.log(totalLength);
// Prints: 42

const bufA = Buffer.concat([buf1, buf2, buf3], totalLength);

console.log(bufA);
// Prints: <Buffer 00 00 00 00 ...>
console.log(bufA.length);
// Prints: 42const { Buffer } = require('node:buffer');

// Create a single `Buffer` from a list of three `Buffer` instances.

const buf1 = Buffer.alloc(10);
const buf2 = Buffer.alloc(14);
const buf3 = Buffer.alloc(18);
const totalLength = buf1.length + buf2.length + buf3.length;

console.log(totalLength);
// Prints: 42

const bufA = Buffer.concat([buf1, buf2, buf3], totalLength);

console.log(bufA);
// Prints: <Buffer 00 00 00 00 ...>
console.log(bufA.length);
// Prints: 42

Buffer.concat() 也可以使用内部的Buffer池,就像Buffer.allocUnsafe()一样。

静态方法:Buffer.copyBytesFrom(view[, offset[, length]])#

view的底层内存复制到一个新的Buffer中。

const u16 = new Uint16Array([0, 0xffff]);
const buf = Buffer.copyBytesFrom(u16, 1, 1);
u16[1] = 0;
console.log(buf.length); // 2
console.log(buf[0]); // 255
console.log(buf[1]); // 255 

静态方法:Buffer.from(array)#

使用范围在0255内的字节array分配一个新的Buffer。超出该范围的数组条目将被截断以适合它。

import { Buffer } from 'node:buffer';

// Creates a new Buffer containing the UTF-8 bytes of the string 'buffer'.
const buf = Buffer.from([0x62, 0x75, 0x66, 0x66, 0x65, 0x72]);const { Buffer } = require('node:buffer');

// Creates a new Buffer containing the UTF-8 bytes of the string 'buffer'.
const buf = Buffer.from([0x62, 0x75, 0x66, 0x66, 0x65, 0x72]);

如果array是一个类似数组的对象(即具有length属性的类型为number的对象),则将其视为数组,除非它是一个BufferUint8Array。这意味着所有其他TypedArray变体都被视为Array。要从TypedArray的底层字节创建Buffer,请使用Buffer.copyBytesFrom()

如果array不是Array或其他适合Buffer.from()变体的类型,则会抛出TypeError

Buffer.from(array)Buffer.from(string) 也可以使用内部的Buffer池,就像Buffer.allocUnsafe()一样。

静态方法:Buffer.from(arrayBuffer[, byteOffset[, length]])#

这将创建一个 ArrayBuffer 的视图,而不会复制底层内存。例如,当传递对 TypedArray 实例的 .buffer 属性的引用时,新创建的 Buffer 将与 TypedArray 的底层 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>

可选的 byteOffsetlength 参数指定 arrayBuffer 内将由 Buffer 共享的内存范围。

import { Buffer } from 'node:buffer';

const ab = new ArrayBuffer(10);
const buf = Buffer.from(ab, 0, 2);

console.log(buf.length);
// Prints: 2const { Buffer } = require('node:buffer');

const ab = new ArrayBuffer(10);
const buf = Buffer.from(ab, 0, 2);

console.log(buf.length);
// Prints: 2

如果 arrayBuffer 不是 ArrayBufferSharedArrayBuffer 或适合 Buffer.from() 变体的其他类型,则将抛出 TypeError

重要的是要记住,支持的 ArrayBuffer 可以覆盖超出 TypedArray 视图范围的内存范围。使用 TypedArraybuffer 属性创建的新 Buffer 可能超出 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>

静态方法:Buffer.from(buffer)#

将传递的 buffer 数据复制到新的 Buffer 实例中。

import { Buffer } from 'node:buffer';

const buf1 = Buffer.from('buffer');
const buf2 = Buffer.from(buf1);

buf1[0] = 0x61;

console.log(buf1.toString());
// Prints: auffer
console.log(buf2.toString());
// Prints: bufferconst { Buffer } = require('node:buffer');

const buf1 = Buffer.from('buffer');
const buf2 = Buffer.from(buf1);

buf1[0] = 0x61;

console.log(buf1.toString());
// Prints: auffer
console.log(buf2.toString());
// Prints: buffer

如果 buffer 不是 Buffer 或其他适合 Buffer.from() 变体的类型,则会抛出 TypeError

静态方法:Buffer.from(object[, offsetOrEncoding[, length]])#

对于 valueOf() 函数返回的值不严格等于 object 的对象,返回 Buffer.from(object.valueOf(), offsetOrEncoding, length)

import { Buffer } from 'node:buffer';

const buf = Buffer.from(new String('this is a test'));
// Prints: <Buffer 74 68 69 73 20 69 73 20 61 20 74 65 73 74>const { Buffer } = require('node:buffer');

const buf = Buffer.from(new String('this is a test'));
// Prints: <Buffer 74 68 69 73 20 69 73 20 61 20 74 65 73 74>

对于支持 Symbol.toPrimitive 的对象,返回 Buffer.from(object[Symbol.toPrimitive]('string'), offsetOrEncoding)

import { Buffer } from 'node:buffer';

class Foo {
  [Symbol.toPrimitive]() {
    return 'this is a test';
  }
}

const buf = Buffer.from(new Foo(), 'utf8');
// Prints: <Buffer 74 68 69 73 20 69 73 20 61 20 74 65 73 74>const { Buffer } = require('node:buffer');

class Foo {
  [Symbol.toPrimitive]() {
    return 'this is a test';
  }
}

const buf = Buffer.from(new Foo(), 'utf8');
// Prints: <Buffer 74 68 69 73 20 69 73 20 61 20 74 65 73 74>

如果 object 没有上述方法或不是适合 Buffer.from() 变体的其他类型,则会抛出 TypeError

静态方法:Buffer.from(string[, encoding])#

  • string <string> 要编码的字符串。
  • encoding <string> string 的编码。默认:'utf8'

创建一个包含 string 的新 Bufferencoding 参数标识将 string 转换为字节时要使用的字符编码。

import { Buffer } from 'node:buffer';

const buf1 = Buffer.from('this is a tést');
const buf2 = Buffer.from('7468697320697320612074c3a97374', 'hex');

console.log(buf1.toString());
// Prints: this is a tést
console.log(buf2.toString());
// Prints: this is a tést
console.log(buf1.toString('latin1'));
// Prints: this is a téstconst { Buffer } = require('node:buffer');

const buf1 = Buffer.from('this is a tést');
const buf2 = Buffer.from('7468697320697320612074c3a97374', 'hex');

console.log(buf1.toString());
// Prints: this is a tést
console.log(buf2.toString());
// Prints: this is a tést
console.log(buf1.toString('latin1'));
// Prints: this is a tést

如果 string 不是字符串或其他适合 Buffer.from() 变体的类型,则会抛出 TypeError

静态方法:Buffer.isBuffer(obj)#

如果 obj 是一个 Buffer,则返回 true,否则返回 false

import { Buffer } from 'node:buffer';

Buffer.isBuffer(Buffer.alloc(10)); // true
Buffer.isBuffer(Buffer.from('foo')); // true
Buffer.isBuffer('a string'); // false
Buffer.isBuffer([]); // false
Buffer.isBuffer(new Uint8Array(1024)); // falseconst { Buffer } = require('node:buffer');

Buffer.isBuffer(Buffer.alloc(10)); // true
Buffer.isBuffer(Buffer.from('foo')); // true
Buffer.isBuffer('a string'); // false
Buffer.isBuffer([]); // false
Buffer.isBuffer(new Uint8Array(1024)); // false

静态方法:Buffer.isEncoding(encoding)#

如果 encoding 是支持的字符编码名称,则返回 true,否则返回 false

import { Buffer } from 'node:buffer';

console.log(Buffer.isEncoding('utf8'));
// Prints: true

console.log(Buffer.isEncoding('hex'));
// Prints: true

console.log(Buffer.isEncoding('utf/8'));
// Prints: false

console.log(Buffer.isEncoding(''));
// Prints: falseconst { Buffer } = require('node:buffer');

console.log(Buffer.isEncoding('utf8'));
// Prints: true

console.log(Buffer.isEncoding('hex'));
// Prints: true

console.log(Buffer.isEncoding('utf/8'));
// Prints: false

console.log(Buffer.isEncoding(''));
// Prints: false

类属性:Buffer.poolSize#

这是用于池化预分配的内部 Buffer 实例的大小(以字节为单位)。此值可以修改。

buf[index]#

索引运算符 [index] 可用于获取和设置 buf 中位置 index 处的八位字节。这些值指的是单个字节,因此合法值范围在 0x000xFF(十六进制)或 0255(十进制)之间。

此运算符继承自 Uint8Array,因此其在越界访问时的行为与 Uint8Array 相同。换句话说,当 index 为负数或大于或等于 buf.length 时,buf[index] 返回 undefined,而当 index 为负数或 >= buf.length 时,buf[index] = value 不会修改缓冲区。

import { Buffer } from 'node:buffer';

// Copy an ASCII string into a `Buffer` one byte at a time.
// (This only works for ASCII-only strings. In general, one should use
// `Buffer.from()` to perform this conversion.)

const str = 'Node.js';
const buf = Buffer.allocUnsafe(str.length);

for (let i = 0; i < str.length; i++) {
  buf[i] = str.charCodeAt(i);
}

console.log(buf.toString('utf8'));
// Prints: Node.jsconst { Buffer } = require('node:buffer');

// Copy an ASCII string into a `Buffer` one byte at a time.
// (This only works for ASCII-only strings. In general, one should use
// `Buffer.from()` to perform this conversion.)

const str = 'Node.js';
const buf = Buffer.allocUnsafe(str.length);

for (let i = 0; i < str.length; i++) {
  buf[i] = str.charCodeAt(i);
}

console.log(buf.toString('utf8'));
// Prints: Node.js

buf.buffer#

  • <ArrayBuffer> 基于此 Buffer 对象创建的底层 ArrayBuffer 对象。

ArrayBuffer 不保证与原始 Buffer 完全对应。有关详细信息,请参阅有关 buf.byteOffset 的说明。

import { Buffer } from 'node:buffer';

const arrayBuffer = new ArrayBuffer(16);
const buffer = Buffer.from(arrayBuffer);

console.log(buffer.buffer === arrayBuffer);
// Prints: trueconst { Buffer } = require('node:buffer');

const arrayBuffer = new ArrayBuffer(16);
const buffer = Buffer.from(arrayBuffer);

console.log(buffer.buffer === arrayBuffer);
// Prints: true

buf.byteOffset#

  • <integer> Buffer 的底层 ArrayBuffer 对象的 byteOffset

Buffer.from(ArrayBuffer, byteOffset, length) 中设置 byteOffset 时,或者有时在分配小于 Buffer.poolSizeBuffer 时,缓冲区不会从底层 ArrayBuffer 的零偏移量开始。

当使用 buf.buffer 直接访问底层 ArrayBuffer 时,这可能会导致问题,因为 ArrayBuffer 的其他部分可能与 Buffer 对象本身无关。

在创建与Buffer共享内存的TypedArray对象时,一个常见问题是需要正确指定byteOffset

import { Buffer } from 'node:buffer';

// Create a buffer smaller than `Buffer.poolSize`.
const nodeBuffer = Buffer.from([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);

// When casting the Node.js Buffer to an Int8Array, use the byteOffset
// to refer only to the part of `nodeBuffer.buffer` that contains the memory
// for `nodeBuffer`.
new Int8Array(nodeBuffer.buffer, nodeBuffer.byteOffset, nodeBuffer.length);const { Buffer } = require('node:buffer');

// Create a buffer smaller than `Buffer.poolSize`.
const nodeBuffer = Buffer.from([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);

// When casting the Node.js Buffer to an Int8Array, use the byteOffset
// to refer only to the part of `nodeBuffer.buffer` that contains the memory
// for `nodeBuffer`.
new Int8Array(nodeBuffer.buffer, nodeBuffer.byteOffset, nodeBuffer.length);

buf.compare(target[, targetStart[, targetEnd[, sourceStart[, sourceEnd]]]])#

  • target <Buffer> | <Uint8Array> 用于与buf比较的BufferUint8Array
  • targetStart <integer>target中开始比较的偏移量。**默认值:**0
  • targetEnd <integer>target中结束比较的偏移量(不包含)。**默认值:**target.length
  • sourceStart <integer>buf中开始比较的偏移量。**默认值:**0
  • sourceEnd <integer>buf中结束比较的偏移量(不包含)。**默认值:**buf.length.
  • 返回值:<integer>

比较buftarget,并返回一个数字,指示buf在排序顺序中是否在target之前、之后或与target相同。比较基于每个Buffer中实际的字节序列。

  • 如果targetbuf相同,则返回0
  • 如果target在排序时应该在buf之前,则返回1
  • 如果target在排序时应该在buf之后,则返回-1
import { Buffer } from 'node:buffer';

const buf1 = Buffer.from('ABC');
const buf2 = Buffer.from('BCD');
const buf3 = Buffer.from('ABCD');

console.log(buf1.compare(buf1));
// Prints: 0
console.log(buf1.compare(buf2));
// Prints: -1
console.log(buf1.compare(buf3));
// Prints: -1
console.log(buf2.compare(buf1));
// Prints: 1
console.log(buf2.compare(buf3));
// Prints: 1
console.log([buf1, buf2, buf3].sort(Buffer.compare));
// Prints: [ <Buffer 41 42 43>, <Buffer 41 42 43 44>, <Buffer 42 43 44> ]
// (This result is equal to: [buf1, buf3, buf2].)const { Buffer } = require('node:buffer');

const buf1 = Buffer.from('ABC');
const buf2 = Buffer.from('BCD');
const buf3 = Buffer.from('ABCD');

console.log(buf1.compare(buf1));
// Prints: 0
console.log(buf1.compare(buf2));
// Prints: -1
console.log(buf1.compare(buf3));
// Prints: -1
console.log(buf2.compare(buf1));
// Prints: 1
console.log(buf2.compare(buf3));
// Prints: 1
console.log([buf1, buf2, buf3].sort(Buffer.compare));
// Prints: [ <Buffer 41 42 43>, <Buffer 41 42 43 44>, <Buffer 42 43 44> ]
// (This result is equal to: [buf1, buf3, buf2].)

可选的 targetStarttargetEndsourceStartsourceEnd 参数可用于将比较限制在 targetbuf 中的特定范围内。

import { Buffer } from 'node:buffer';

const buf1 = Buffer.from([1, 2, 3, 4, 5, 6, 7, 8, 9]);
const buf2 = Buffer.from([5, 6, 7, 8, 9, 1, 2, 3, 4]);

console.log(buf1.compare(buf2, 5, 9, 0, 4));
// Prints: 0
console.log(buf1.compare(buf2, 0, 6, 4));
// Prints: -1
console.log(buf1.compare(buf2, 5, 6, 5));
// Prints: 1const { Buffer } = require('node:buffer');

const buf1 = Buffer.from([1, 2, 3, 4, 5, 6, 7, 8, 9]);
const buf2 = Buffer.from([5, 6, 7, 8, 9, 1, 2, 3, 4]);

console.log(buf1.compare(buf2, 5, 9, 0, 4));
// Prints: 0
console.log(buf1.compare(buf2, 0, 6, 4));
// Prints: -1
console.log(buf1.compare(buf2, 5, 6, 5));
// Prints: 1

如果 targetStart < 0sourceStart < 0targetEnd > target.byteLengthsourceEnd > source.byteLength,则会抛出 ERR_OUT_OF_RANGE 错误。

buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])#

将数据从 buf 的一个区域复制到 target 的一个区域,即使 target 内存区域与 buf 重叠。

TypedArray.prototype.set() 执行相同的操作,并且适用于所有 TypedArray,包括 Node.js Buffer,尽管它采用不同的函数参数。

import { Buffer } from 'node:buffer';

// Create two `Buffer` instances.
const buf1 = Buffer.allocUnsafe(26);
const buf2 = Buffer.allocUnsafe(26).fill('!');

for (let i = 0; i < 26; i++) {
  // 97 is the decimal ASCII value for 'a'.
  buf1[i] = i + 97;
}

// Copy `buf1` bytes 16 through 19 into `buf2` starting at byte 8 of `buf2`.
buf1.copy(buf2, 8, 16, 20);
// This is equivalent to:
// buf2.set(buf1.subarray(16, 20), 8);

console.log(buf2.toString('ascii', 0, 25));
// Prints: !!!!!!!!qrst!!!!!!!!!!!!!const { Buffer } = require('node:buffer');

// Create two `Buffer` instances.
const buf1 = Buffer.allocUnsafe(26);
const buf2 = Buffer.allocUnsafe(26).fill('!');

for (let i = 0; i < 26; i++) {
  // 97 is the decimal ASCII value for 'a'.
  buf1[i] = i + 97;
}

// Copy `buf1` bytes 16 through 19 into `buf2` starting at byte 8 of `buf2`.
buf1.copy(buf2, 8, 16, 20);
// This is equivalent to:
// buf2.set(buf1.subarray(16, 20), 8);

console.log(buf2.toString('ascii', 0, 25));
// Prints: !!!!!!!!qrst!!!!!!!!!!!!!
import { Buffer } from 'node:buffer';

// Create a `Buffer` and copy data from one region to an overlapping region
// within the same `Buffer`.

const buf = Buffer.allocUnsafe(26);

for (let i = 0; i < 26; i++) {
  // 97 is the decimal ASCII value for 'a'.
  buf[i] = i + 97;
}

buf.copy(buf, 0, 4, 10);

console.log(buf.toString());
// Prints: efghijghijklmnopqrstuvwxyzconst { Buffer } = require('node:buffer');

// Create a `Buffer` and copy data from one region to an overlapping region
// within the same `Buffer`.

const buf = Buffer.allocUnsafe(26);

for (let i = 0; i < 26; i++) {
  // 97 is the decimal ASCII value for 'a'.
  buf[i] = i + 97;
}

buf.copy(buf, 0, 4, 10);

console.log(buf.toString());
// Prints: efghijghijklmnopqrstuvwxyz

buf.entries()#

buf 的内容中创建并返回一个包含 [索引, 字节] 对的 迭代器

import { Buffer } from 'node:buffer';

// Log the entire contents of a `Buffer`.

const buf = Buffer.from('buffer');

for (const pair of buf.entries()) {
  console.log(pair);
}
// Prints:
//   [0, 98]
//   [1, 117]
//   [2, 102]
//   [3, 102]
//   [4, 101]
//   [5, 114]const { Buffer } = require('node:buffer');

// Log the entire contents of a `Buffer`.

const buf = Buffer.from('buffer');

for (const pair of buf.entries()) {
  console.log(pair);
}
// Prints:
//   [0, 98]
//   [1, 117]
//   [2, 102]
//   [3, 102]
//   [4, 101]
//   [5, 114]

buf.equals(otherBuffer)#

如果 bufotherBuffer 的字节完全相同,则返回 true,否则返回 false。等效于 buf.compare(otherBuffer) === 0

import { Buffer } from 'node:buffer';

const buf1 = Buffer.from('ABC');
const buf2 = Buffer.from('414243', 'hex');
const buf3 = Buffer.from('ABCD');

console.log(buf1.equals(buf2));
// Prints: true
console.log(buf1.equals(buf3));
// Prints: falseconst { Buffer } = require('node:buffer');

const buf1 = Buffer.from('ABC');
const buf2 = Buffer.from('414243', 'hex');
const buf3 = Buffer.from('ABCD');

console.log(buf1.equals(buf2));
// Prints: true
console.log(buf1.equals(buf3));
// Prints: false

buf.fill(value[, offset[, end]][, encoding])#

  • value <string> | <Buffer> | <Uint8Array> | <integer> 用于填充 buf 的值。空值(字符串、Uint8Array、Buffer)将被强制转换为 0
  • offset <integer> 在开始填充 buf 之前要跳过的字节数。默认值: 0
  • end <integer> 停止填充 buf 的位置(不包括)。默认值: buf.length.
  • encoding <string> 如果 value 是字符串,则为 value 的编码。默认值: 'utf8'
  • 返回值: <Buffer>buf 的引用。

用指定的 value 填充 buf。如果没有给出 offsetend,则将填充整个 buf

import { Buffer } from 'node:buffer';

// Fill a `Buffer` with the ASCII character 'h'.

const b = Buffer.allocUnsafe(50).fill('h');

console.log(b.toString());
// Prints: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh

// Fill a buffer with empty string
const c = Buffer.allocUnsafe(5).fill('');

console.log(c.fill(''));
// Prints: <Buffer 00 00 00 00 00>const { Buffer } = require('node:buffer');

// Fill a `Buffer` with the ASCII character 'h'.

const b = Buffer.allocUnsafe(50).fill('h');

console.log(b.toString());
// Prints: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh

// Fill a buffer with empty string
const c = Buffer.allocUnsafe(5).fill('');

console.log(c.fill(''));
// Prints: <Buffer 00 00 00 00 00>

如果 value 不是字符串、Buffer 或整数,则将其强制转换为 uint32 值。如果结果整数大于 255(十进制),则 buf 将被 value & 255 填充。

如果 fill() 操作的最后一次写入落在多字节字符上,则只有适合 buf 的该字符的字节会被写入

import { Buffer } from 'node:buffer';

// Fill a `Buffer` with character that takes up two bytes in UTF-8.

console.log(Buffer.allocUnsafe(5).fill('\u0222'));
// Prints: <Buffer c8 a2 c8 a2 c8>const { Buffer } = require('node:buffer');

// Fill a `Buffer` with character that takes up two bytes in UTF-8.

console.log(Buffer.allocUnsafe(5).fill('\u0222'));
// Prints: <Buffer c8 a2 c8 a2 c8>

如果value包含无效字符,则会将其截断;如果没有任何有效的填充数据剩余,则会抛出异常。

import { Buffer } from 'node:buffer';

const buf = Buffer.allocUnsafe(5);

console.log(buf.fill('a'));
// Prints: <Buffer 61 61 61 61 61>
console.log(buf.fill('aazz', 'hex'));
// Prints: <Buffer aa aa aa aa aa>
console.log(buf.fill('zz', 'hex'));
// Throws an exception.const { Buffer } = require('node:buffer');

const buf = Buffer.allocUnsafe(5);

console.log(buf.fill('a'));
// Prints: <Buffer 61 61 61 61 61>
console.log(buf.fill('aazz', 'hex'));
// Prints: <Buffer aa aa aa aa aa>
console.log(buf.fill('zz', 'hex'));
// Throws an exception.

buf.includes(value[, byteOffset][, encoding])#

  • value <string> | <Buffer> | <Uint8Array> | <integer> 要搜索的内容。
  • byteOffset <integer>buf中开始搜索的位置。如果为负数,则偏移量将从buf的末尾计算。默认值:0
  • encoding <string> 如果value是字符串,则这是其编码。默认值:'utf8'
  • 返回值:<boolean> 如果在buf中找到value,则返回true,否则返回false

等效于 buf.indexOf() !== -1.

import { Buffer } from 'node:buffer';

const buf = Buffer.from('this is a buffer');

console.log(buf.includes('this'));
// Prints: true
console.log(buf.includes('is'));
// Prints: true
console.log(buf.includes(Buffer.from('a buffer')));
// Prints: true
console.log(buf.includes(97));
// Prints: true (97 is the decimal ASCII value for 'a')
console.log(buf.includes(Buffer.from('a buffer example')));
// Prints: false
console.log(buf.includes(Buffer.from('a buffer example').slice(0, 8)));
// Prints: true
console.log(buf.includes('this', 4));
// Prints: falseconst { Buffer } = require('node:buffer');

const buf = Buffer.from('this is a buffer');

console.log(buf.includes('this'));
// Prints: true
console.log(buf.includes('is'));
// Prints: true
console.log(buf.includes(Buffer.from('a buffer')));
// Prints: true
console.log(buf.includes(97));
// Prints: true (97 is the decimal ASCII value for 'a')
console.log(buf.includes(Buffer.from('a buffer example')));
// Prints: false
console.log(buf.includes(Buffer.from('a buffer example').slice(0, 8)));
// Prints: true
console.log(buf.includes('this', 4));
// Prints: false

buf.indexOf(value[, byteOffset][, encoding])#

  • value <string> | <Buffer> | <Uint8Array> | <integer> 要搜索的内容。
  • byteOffset <integer>buf中开始搜索的位置。如果为负数,则偏移量将从buf的末尾计算。默认值:0
  • encoding <string> 如果value是字符串,则这是用于确定将在buf中搜索的字符串的二进制表示的编码。默认值:'utf8'
  • 返回值:<integer> valuebuf中首次出现的索引,如果buf不包含value,则返回-1

如果value

  • 字符串,则根据encoding中的字符编码解释value
  • BufferUint8Array,则将使用value的全部内容。要比较部分Buffer,请使用buf.subarray.
  • 如果 value 是一个数字,它将被解释为一个介于 0255 之间的无符号 8 位整数。
import { Buffer } from 'node:buffer';

const buf = Buffer.from('this is a buffer');

console.log(buf.indexOf('this'));
// Prints: 0
console.log(buf.indexOf('is'));
// Prints: 2
console.log(buf.indexOf(Buffer.from('a buffer')));
// Prints: 8
console.log(buf.indexOf(97));
// Prints: 8 (97 is the decimal ASCII value for 'a')
console.log(buf.indexOf(Buffer.from('a buffer example')));
// Prints: -1
console.log(buf.indexOf(Buffer.from('a buffer example').slice(0, 8)));
// Prints: 8

const utf16Buffer = Buffer.from('\u039a\u0391\u03a3\u03a3\u0395', 'utf16le');

console.log(utf16Buffer.indexOf('\u03a3', 0, 'utf16le'));
// Prints: 4
console.log(utf16Buffer.indexOf('\u03a3', -4, 'utf16le'));
// Prints: 6const { Buffer } = require('node:buffer');

const buf = Buffer.from('this is a buffer');

console.log(buf.indexOf('this'));
// Prints: 0
console.log(buf.indexOf('is'));
// Prints: 2
console.log(buf.indexOf(Buffer.from('a buffer')));
// Prints: 8
console.log(buf.indexOf(97));
// Prints: 8 (97 is the decimal ASCII value for 'a')
console.log(buf.indexOf(Buffer.from('a buffer example')));
// Prints: -1
console.log(buf.indexOf(Buffer.from('a buffer example').slice(0, 8)));
// Prints: 8

const utf16Buffer = Buffer.from('\u039a\u0391\u03a3\u03a3\u0395', 'utf16le');

console.log(utf16Buffer.indexOf('\u03a3', 0, 'utf16le'));
// Prints: 4
console.log(utf16Buffer.indexOf('\u03a3', -4, 'utf16le'));
// Prints: 6

如果 value 不是字符串、数字或 Buffer,此方法将抛出 TypeError。如果 value 是一个数字,它将被强制转换为一个有效的字节值,即介于 0 和 255 之间的整数。

如果 byteOffset 不是一个数字,它将被强制转换为一个数字。如果强制转换的结果是 NaN0,则将搜索整个缓冲区。此行为与 String.prototype.indexOf() 相匹配。

import { Buffer } from 'node:buffer';

const b = Buffer.from('abcdef');

// Passing a value that's a number, but not a valid byte.
// Prints: 2, equivalent to searching for 99 or 'c'.
console.log(b.indexOf(99.9));
console.log(b.indexOf(256 + 99));

// Passing a byteOffset that coerces to NaN or 0.
// Prints: 1, searching the whole buffer.
console.log(b.indexOf('b', undefined));
console.log(b.indexOf('b', {}));
console.log(b.indexOf('b', null));
console.log(b.indexOf('b', []));const { Buffer } = require('node:buffer');

const b = Buffer.from('abcdef');

// Passing a value that's a number, but not a valid byte.
// Prints: 2, equivalent to searching for 99 or 'c'.
console.log(b.indexOf(99.9));
console.log(b.indexOf(256 + 99));

// Passing a byteOffset that coerces to NaN or 0.
// Prints: 1, searching the whole buffer.
console.log(b.indexOf('b', undefined));
console.log(b.indexOf('b', {}));
console.log(b.indexOf('b', null));
console.log(b.indexOf('b', []));

如果 value 是一个空字符串或空 Buffer 并且 byteOffset 小于 buf.length,则将返回 byteOffset。如果 value 为空且 byteOffset 至少为 buf.length,则将返回 buf.length

buf.keys()#

创建并返回一个 buf 键(索引)的 迭代器

import { Buffer } from 'node:buffer';

const buf = Buffer.from('buffer');

for (const key of buf.keys()) {
  console.log(key);
}
// Prints:
//   0
//   1
//   2
//   3
//   4
//   5const { Buffer } = require('node:buffer');

const buf = Buffer.from('buffer');

for (const key of buf.keys()) {
  console.log(key);
}
// Prints:
//   0
//   1
//   2
//   3
//   4
//   5

buf.lastIndexOf(value[, byteOffset][, encoding])#

  • value <string> | <Buffer> | <Uint8Array> | <integer> 要搜索的内容。
  • byteOffset <integer>buf 中开始搜索的位置。如果为负数,则偏移量从 buf 的末尾计算。默认值: buf.length - 1
  • encoding <string> 如果value是字符串,则这是用于确定将在buf中搜索的字符串的二进制表示的编码。默认值:'utf8'
  • 返回:<integer> valuebuf 中最后一次出现的索引,如果 buf 不包含 value,则返回 -1

buf.indexOf() 相同,只是找到的是 value 的最后一次出现,而不是第一次出现。

import { Buffer } from 'node:buffer';

const buf = Buffer.from('this buffer is a buffer');

console.log(buf.lastIndexOf('this'));
// Prints: 0
console.log(buf.lastIndexOf('buffer'));
// Prints: 17
console.log(buf.lastIndexOf(Buffer.from('buffer')));
// Prints: 17
console.log(buf.lastIndexOf(97));
// Prints: 15 (97 is the decimal ASCII value for 'a')
console.log(buf.lastIndexOf(Buffer.from('yolo')));
// Prints: -1
console.log(buf.lastIndexOf('buffer', 5));
// Prints: 5
console.log(buf.lastIndexOf('buffer', 4));
// Prints: -1

const utf16Buffer = Buffer.from('\u039a\u0391\u03a3\u03a3\u0395', 'utf16le');

console.log(utf16Buffer.lastIndexOf('\u03a3', undefined, 'utf16le'));
// Prints: 6
console.log(utf16Buffer.lastIndexOf('\u03a3', -5, 'utf16le'));
// Prints: 4const { Buffer } = require('node:buffer');

const buf = Buffer.from('this buffer is a buffer');

console.log(buf.lastIndexOf('this'));
// Prints: 0
console.log(buf.lastIndexOf('buffer'));
// Prints: 17
console.log(buf.lastIndexOf(Buffer.from('buffer')));
// Prints: 17
console.log(buf.lastIndexOf(97));
// Prints: 15 (97 is the decimal ASCII value for 'a')
console.log(buf.lastIndexOf(Buffer.from('yolo')));
// Prints: -1
console.log(buf.lastIndexOf('buffer', 5));
// Prints: 5
console.log(buf.lastIndexOf('buffer', 4));
// Prints: -1

const utf16Buffer = Buffer.from('\u039a\u0391\u03a3\u03a3\u0395', 'utf16le');

console.log(utf16Buffer.lastIndexOf('\u03a3', undefined, 'utf16le'));
// Prints: 6
console.log(utf16Buffer.lastIndexOf('\u03a3', -5, 'utf16le'));
// Prints: 4

如果 value 不是字符串、数字或 Buffer,此方法将抛出 TypeError。如果 value 是一个数字,它将被强制转换为一个有效的字节值,即介于 0 和 255 之间的整数。

如果 byteOffset 不是一个数字,它将被强制转换为一个数字。任何强制转换为 NaN 的参数,例如 {}undefined,都将搜索整个缓冲区。此行为与 String.prototype.lastIndexOf() 相匹配。

import { Buffer } from 'node:buffer';

const b = Buffer.from('abcdef');

// Passing a value that's a number, but not a valid byte.
// Prints: 2, equivalent to searching for 99 or 'c'.
console.log(b.lastIndexOf(99.9));
console.log(b.lastIndexOf(256 + 99));

// Passing a byteOffset that coerces to NaN.
// Prints: 1, searching the whole buffer.
console.log(b.lastIndexOf('b', undefined));
console.log(b.lastIndexOf('b', {}));

// Passing a byteOffset that coerces to 0.
// Prints: -1, equivalent to passing 0.
console.log(b.lastIndexOf('b', null));
console.log(b.lastIndexOf('b', []));const { Buffer } = require('node:buffer');

const b = Buffer.from('abcdef');

// Passing a value that's a number, but not a valid byte.
// Prints: 2, equivalent to searching for 99 or 'c'.
console.log(b.lastIndexOf(99.9));
console.log(b.lastIndexOf(256 + 99));

// Passing a byteOffset that coerces to NaN.
// Prints: 1, searching the whole buffer.
console.log(b.lastIndexOf('b', undefined));
console.log(b.lastIndexOf('b', {}));

// Passing a byteOffset that coerces to 0.
// Prints: -1, equivalent to passing 0.
console.log(b.lastIndexOf('b', null));
console.log(b.lastIndexOf('b', []));

如果value 是一个空字符串或空Buffer,则将返回byteOffset

buf.length#

返回buf 中的字节数。

import { Buffer } from 'node:buffer';

// Create a `Buffer` and write a shorter string to it using UTF-8.

const buf = Buffer.alloc(1234);

console.log(buf.length);
// Prints: 1234

buf.write('some string', 0, 'utf8');

console.log(buf.length);
// Prints: 1234const { Buffer } = require('node:buffer');

// Create a `Buffer` and write a shorter string to it using UTF-8.

const buf = Buffer.alloc(1234);

console.log(buf.length);
// Prints: 1234

buf.write('some string', 0, 'utf8');

console.log(buf.length);
// Prints: 1234

buf.parent#

稳定性:0 - 已弃用:请改用 buf.buffer

buf.parent 属性是 buf.buffer 的已弃用别名。

buf.readBigInt64BE([offset])#

  • offset <整数> 开始读取前要跳过的字节数。必须满足:0 <= offset <= buf.length - 8默认值:0
  • 返回值:<bigint>

buf 中指定offset 处读取一个带符号的大端 64 位整数。

Buffer 中读取的整数被解释为二进制补码带符号值。

buf.readBigInt64LE([offset])#

  • offset <整数> 开始读取前要跳过的字节数。必须满足:0 <= offset <= buf.length - 8默认值:0
  • 返回值:<bigint>

buf 中指定offset 处读取一个带符号的小端 64 位整数。

Buffer 中读取的整数被解释为二进制补码带符号值。

buf.readBigUInt64BE([offset])#

  • offset <整数> 开始读取前要跳过的字节数。必须满足:0 <= offset <= buf.length - 8默认值:0
  • 返回值:<bigint>

buf 中指定offset 处读取一个无符号的大端 64 位整数。

此函数也可在readBigUint64BE 别名下使用。

import { Buffer } from 'node:buffer';

const buf = Buffer.from([0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff]);

console.log(buf.readBigUInt64BE(0));
// Prints: 4294967295nconst { Buffer } = require('node:buffer');

const buf = Buffer.from([0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff]);

console.log(buf.readBigUInt64BE(0));
// Prints: 4294967295n

buf.readBigUInt64LE([offset])#

  • offset <整数> 开始读取前要跳过的字节数。必须满足:0 <= offset <= buf.length - 8默认值:0
  • 返回值:<bigint>

buf 中指定offset 处读取一个无符号的小端 64 位整数。

此函数也可在readBigUint64LE 别名下使用。

import { Buffer } from 'node:buffer';

const buf = Buffer.from([0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff]);

console.log(buf.readBigUInt64LE(0));
// Prints: 18446744069414584320nconst { Buffer } = require('node:buffer');

const buf = Buffer.from([0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff]);

console.log(buf.readBigUInt64LE(0));
// Prints: 18446744069414584320n

buf.readDoubleBE([offset])#

  • offset <整数> 开始读取前要跳过的字节数。必须满足 0 <= offset <= buf.length - 8默认值:0
  • 返回值:<number>

从指定offset处的buf读取一个 64 位大端双精度浮点数。

import { Buffer } from 'node:buffer';

const buf = Buffer.from([1, 2, 3, 4, 5, 6, 7, 8]);

console.log(buf.readDoubleBE(0));
// Prints: 8.20788039913184e-304const { Buffer } = require('node:buffer');

const buf = Buffer.from([1, 2, 3, 4, 5, 6, 7, 8]);

console.log(buf.readDoubleBE(0));
// Prints: 8.20788039913184e-304

buf.readDoubleLE([offset])#

  • offset <整数> 开始读取前要跳过的字节数。必须满足 0 <= offset <= buf.length - 8默认值:0
  • 返回值:<number>

从指定offset处的buf读取一个 64 位小端双精度浮点数。

import { Buffer } from 'node:buffer';

const buf = Buffer.from([1, 2, 3, 4, 5, 6, 7, 8]);

console.log(buf.readDoubleLE(0));
// Prints: 5.447603722011605e-270
console.log(buf.readDoubleLE(1));
// Throws ERR_OUT_OF_RANGE.const { Buffer } = require('node:buffer');

const buf = Buffer.from([1, 2, 3, 4, 5, 6, 7, 8]);

console.log(buf.readDoubleLE(0));
// Prints: 5.447603722011605e-270
console.log(buf.readDoubleLE(1));
// Throws ERR_OUT_OF_RANGE.

buf.readFloatBE([offset])#

  • offset <integer> 开始读取之前要跳过的字节数。必须满足0 <= offset <= buf.length - 4默认值:0
  • 返回值:<number>

从指定offset处的buf读取一个 32 位大端单精度浮点数。

import { Buffer } from 'node:buffer';

const buf = Buffer.from([1, 2, 3, 4]);

console.log(buf.readFloatBE(0));
// Prints: 2.387939260590663e-38const { Buffer } = require('node:buffer');

const buf = Buffer.from([1, 2, 3, 4]);

console.log(buf.readFloatBE(0));
// Prints: 2.387939260590663e-38

buf.readFloatLE([offset])#

  • offset <integer> 开始读取之前要跳过的字节数。必须满足0 <= offset <= buf.length - 4默认值:0
  • 返回值:<number>

从指定offset处的buf读取一个 32 位小端单精度浮点数。

import { Buffer } from 'node:buffer';

const buf = Buffer.from([1, 2, 3, 4]);

console.log(buf.readFloatLE(0));
// Prints: 1.539989614439558e-36
console.log(buf.readFloatLE(1));
// Throws ERR_OUT_OF_RANGE.const { Buffer } = require('node:buffer');

const buf = Buffer.from([1, 2, 3, 4]);

console.log(buf.readFloatLE(0));
// Prints: 1.539989614439558e-36
console.log(buf.readFloatLE(1));
// Throws ERR_OUT_OF_RANGE.

buf.readInt8([offset])#

  • offset <integer> 开始读取之前要跳过的字节数。必须满足0 <= offset <= buf.length - 1默认值:0
  • 返回值:<integer>

从指定offset处的buf读取一个有符号的 8 位整数。

Buffer 中读取的整数被解释为二进制补码带符号值。

import { Buffer } from 'node:buffer';

const buf = Buffer.from([-1, 5]);

console.log(buf.readInt8(0));
// Prints: -1
console.log(buf.readInt8(1));
// Prints: 5
console.log(buf.readInt8(2));
// Throws ERR_OUT_OF_RANGE.const { Buffer } = require('node:buffer');

const buf = Buffer.from([-1, 5]);

console.log(buf.readInt8(0));
// Prints: -1
console.log(buf.readInt8(1));
// Prints: 5
console.log(buf.readInt8(2));
// Throws ERR_OUT_OF_RANGE.

buf.readInt16BE([offset])#

  • offset <integer> 开始读取之前要跳过的字节数。必须满足0 <= offset <= buf.length - 2默认值:0
  • 返回值:<integer>

从指定offset处的buf读取一个有符号的大端 16 位整数。

Buffer 中读取的整数被解释为二进制补码带符号值。

import { Buffer } from 'node:buffer';

const buf = Buffer.from([0, 5]);

console.log(buf.readInt16BE(0));
// Prints: 5const { Buffer } = require('node:buffer');

const buf = Buffer.from([0, 5]);

console.log(buf.readInt16BE(0));
// Prints: 5

buf.readInt16LE([offset])#

  • offset <integer> 开始读取之前要跳过的字节数。必须满足0 <= offset <= buf.length - 2默认值:0
  • 返回值:<integer>

从指定offset处的buf读取一个有符号的小端 16 位整数。

Buffer 中读取的整数被解释为二进制补码带符号值。

import { Buffer } from 'node:buffer';

const buf = Buffer.from([0, 5]);

console.log(buf.readInt16LE(0));
// Prints: 1280
console.log(buf.readInt16LE(1));
// Throws ERR_OUT_OF_RANGE.const { Buffer } = require('node:buffer');

const buf = Buffer.from([0, 5]);

console.log(buf.readInt16LE(0));
// Prints: 1280
console.log(buf.readInt16LE(1));
// Throws ERR_OUT_OF_RANGE.

buf.readInt32BE([offset])#

  • offset <integer> 开始读取之前要跳过的字节数。必须满足0 <= offset <= buf.length - 4默认值:0
  • 返回值:<integer>

从指定offset处的buf中读取一个带符号的大端32位整数。

Buffer 中读取的整数被解释为二进制补码带符号值。

import { Buffer } from 'node:buffer';

const buf = Buffer.from([0, 0, 0, 5]);

console.log(buf.readInt32BE(0));
// Prints: 5const { Buffer } = require('node:buffer');

const buf = Buffer.from([0, 0, 0, 5]);

console.log(buf.readInt32BE(0));
// Prints: 5

buf.readInt32LE([offset])#

  • offset <integer> 开始读取之前要跳过的字节数。必须满足0 <= offset <= buf.length - 4默认值:0
  • 返回值:<integer>

从指定offset处的buf中读取一个带符号的小端32位整数。

Buffer 中读取的整数被解释为二进制补码带符号值。

import { Buffer } from 'node:buffer';

const buf = Buffer.from([0, 0, 0, 5]);

console.log(buf.readInt32LE(0));
// Prints: 83886080
console.log(buf.readInt32LE(1));
// Throws ERR_OUT_OF_RANGE.const { Buffer } = require('node:buffer');

const buf = Buffer.from([0, 0, 0, 5]);

console.log(buf.readInt32LE(0));
// Prints: 83886080
console.log(buf.readInt32LE(1));
// Throws ERR_OUT_OF_RANGE.

buf.readIntBE(offset, byteLength)#

  • offset <integer> 开始读取之前要跳过的字节数。必须满足0 <= offset <= buf.length - byteLength
  • byteLength <integer> 要读取的字节数。必须满足0 < byteLength <= 6
  • 返回值:<integer>

从指定offset处的buf中读取byteLength个字节,并将结果解释为一个大端、二进制补码带符号值,支持高达48位的精度。

import { Buffer } from 'node:buffer';

const buf = Buffer.from([0x12, 0x34, 0x56, 0x78, 0x90, 0xab]);

console.log(buf.readIntBE(0, 6).toString(16));
// Prints: 1234567890ab
console.log(buf.readIntBE(1, 6).toString(16));
// Throws ERR_OUT_OF_RANGE.
console.log(buf.readIntBE(1, 0).toString(16));
// Throws ERR_OUT_OF_RANGE.const { Buffer } = require('node:buffer');

const buf = Buffer.from([0x12, 0x34, 0x56, 0x78, 0x90, 0xab]);

console.log(buf.readIntBE(0, 6).toString(16));
// Prints: 1234567890ab
console.log(buf.readIntBE(1, 6).toString(16));
// Throws ERR_OUT_OF_RANGE.
console.log(buf.readIntBE(1, 0).toString(16));
// Throws ERR_OUT_OF_RANGE.

buf.readIntLE(offset, byteLength)#

  • offset <integer> 开始读取之前要跳过的字节数。必须满足0 <= offset <= buf.length - byteLength
  • byteLength <integer> 要读取的字节数。必须满足0 < byteLength <= 6
  • 返回值:<integer>

从指定offset处的buf中读取byteLength个字节,并将结果解释为一个小端、二进制补码带符号值,支持高达48位的精度。

import { Buffer } from 'node:buffer';

const buf = Buffer.from([0x12, 0x34, 0x56, 0x78, 0x90, 0xab]);

console.log(buf.readIntLE(0, 6).toString(16));
// Prints: -546f87a9cbeeconst { Buffer } = require('node:buffer');

const buf = Buffer.from([0x12, 0x34, 0x56, 0x78, 0x90, 0xab]);

console.log(buf.readIntLE(0, 6).toString(16));
// Prints: -546f87a9cbee

buf.readUInt8([offset])#

  • offset <integer> 开始读取之前要跳过的字节数。必须满足0 <= offset <= buf.length - 1默认值:0
  • 返回值:<integer>

从指定offset处的buf中读取一个无符号的8位整数。

此函数也可以在readUint8别名下使用。

import { Buffer } from 'node:buffer';

const buf = Buffer.from([1, -2]);

console.log(buf.readUInt8(0));
// Prints: 1
console.log(buf.readUInt8(1));
// Prints: 254
console.log(buf.readUInt8(2));
// Throws ERR_OUT_OF_RANGE.const { Buffer } = require('node:buffer');

const buf = Buffer.from([1, -2]);

console.log(buf.readUInt8(0));
// Prints: 1
console.log(buf.readUInt8(1));
// Prints: 254
console.log(buf.readUInt8(2));
// Throws ERR_OUT_OF_RANGE.

buf.readUInt16BE([offset])#

  • offset <integer> 开始读取之前要跳过的字节数。必须满足0 <= offset <= buf.length - 2默认值:0
  • 返回值:<integer>

从指定offset处的buf中读取一个无符号的大端16位整数。

此函数也可以在readUint16BE别名下使用。

import { Buffer } from 'node:buffer';

const buf = Buffer.from([0x12, 0x34, 0x56]);

console.log(buf.readUInt16BE(0).toString(16));
// Prints: 1234
console.log(buf.readUInt16BE(1).toString(16));
// Prints: 3456const { Buffer } = require('node:buffer');

const buf = Buffer.from([0x12, 0x34, 0x56]);

console.log(buf.readUInt16BE(0).toString(16));
// Prints: 1234
console.log(buf.readUInt16BE(1).toString(16));
// Prints: 3456

buf.readUInt16LE([offset])#

  • offset <integer> 开始读取之前要跳过的字节数。必须满足0 <= offset <= buf.length - 2默认值:0
  • 返回值:<integer>

buf 中指定 offset 位置读取一个无符号的小端 16 位整数。

此函数也可以使用 readUInt16LE 别名。

import { Buffer } from 'node:buffer';

const buf = Buffer.from([0x12, 0x34, 0x56]);

console.log(buf.readUInt16LE(0).toString(16));
// Prints: 3412
console.log(buf.readUInt16LE(1).toString(16));
// Prints: 5634
console.log(buf.readUInt16LE(2).toString(16));
// Throws ERR_OUT_OF_RANGE.const { Buffer } = require('node:buffer');

const buf = Buffer.from([0x12, 0x34, 0x56]);

console.log(buf.readUInt16LE(0).toString(16));
// Prints: 3412
console.log(buf.readUInt16LE(1).toString(16));
// Prints: 5634
console.log(buf.readUInt16LE(2).toString(16));
// Throws ERR_OUT_OF_RANGE.

buf.readUInt32BE([offset])#

  • offset <integer> 开始读取之前要跳过的字节数。必须满足0 <= offset <= buf.length - 4默认值:0
  • 返回值:<integer>

buf 中指定 offset 位置读取一个无符号的大端 32 位整数。

此函数也可以使用 readUint32BE 别名。

import { Buffer } from 'node:buffer';

const buf = Buffer.from([0x12, 0x34, 0x56, 0x78]);

console.log(buf.readUInt32BE(0).toString(16));
// Prints: 12345678const { Buffer } = require('node:buffer');

const buf = Buffer.from([0x12, 0x34, 0x56, 0x78]);

console.log(buf.readUInt32BE(0).toString(16));
// Prints: 12345678

buf.readUInt32LE([offset])#

  • offset <integer> 开始读取之前要跳过的字节数。必须满足0 <= offset <= buf.length - 4默认值:0
  • 返回值:<integer>

buf 中指定 offset 位置读取一个无符号的小端 32 位整数。

此函数也可以使用 readUint32LE 别名。

import { Buffer } from 'node:buffer';

const buf = Buffer.from([0x12, 0x34, 0x56, 0x78]);

console.log(buf.readUInt32LE(0).toString(16));
// Prints: 78563412
console.log(buf.readUInt32LE(1).toString(16));
// Throws ERR_OUT_OF_RANGE.const { Buffer } = require('node:buffer');

const buf = Buffer.from([0x12, 0x34, 0x56, 0x78]);

console.log(buf.readUInt32LE(0).toString(16));
// Prints: 78563412
console.log(buf.readUInt32LE(1).toString(16));
// Throws ERR_OUT_OF_RANGE.

buf.readUIntBE(offset, byteLength)#

  • offset <integer> 开始读取之前要跳过的字节数。必须满足0 <= offset <= buf.length - byteLength
  • byteLength <integer> 要读取的字节数。必须满足0 < byteLength <= 6
  • 返回值:<integer>

buf 中指定 offset 位置读取 byteLength 个字节,并将结果解释为一个无符号的大端整数,支持高达 48 位的精度。

此函数也可以使用 readUintBE 别名。

import { Buffer } from 'node:buffer';

const buf = Buffer.from([0x12, 0x34, 0x56, 0x78, 0x90, 0xab]);

console.log(buf.readUIntBE(0, 6).toString(16));
// Prints: 1234567890ab
console.log(buf.readUIntBE(1, 6).toString(16));
// Throws ERR_OUT_OF_RANGE.const { Buffer } = require('node:buffer');

const buf = Buffer.from([0x12, 0x34, 0x56, 0x78, 0x90, 0xab]);

console.log(buf.readUIntBE(0, 6).toString(16));
// Prints: 1234567890ab
console.log(buf.readUIntBE(1, 6).toString(16));
// Throws ERR_OUT_OF_RANGE.

buf.readUIntLE(offset, byteLength)#

  • offset <integer> 开始读取之前要跳过的字节数。必须满足0 <= offset <= buf.length - byteLength
  • byteLength <integer> 要读取的字节数。必须满足0 < byteLength <= 6
  • 返回值:<integer>

buf 中指定 offset 位置读取 byteLength 个字节,并将结果解释为一个无符号的小端整数,支持高达 48 位的精度。

此函数也可以使用 readUintLE 别名。

import { Buffer } from 'node:buffer';

const buf = Buffer.from([0x12, 0x34, 0x56, 0x78, 0x90, 0xab]);

console.log(buf.readUIntLE(0, 6).toString(16));
// Prints: ab9078563412const { Buffer } = require('node:buffer');

const buf = Buffer.from([0x12, 0x34, 0x56, 0x78, 0x90, 0xab]);

console.log(buf.readUIntLE(0, 6).toString(16));
// Prints: ab9078563412

buf.subarray([start[, end]])#

返回一个新的 Buffer,它引用与原始 Buffer 相同的内存,但被 startend 索引偏移和裁剪。

指定 end 大于 buf.length 将返回与 end 等于 buf.length 相同的结果。

此方法继承自 TypedArray.prototype.subarray().

修改新的 Buffer 切片将修改原始 Buffer 中的内存,因为两个对象的分配内存重叠。

import { Buffer } from 'node:buffer';

// Create a `Buffer` with the ASCII alphabet, take a slice, and modify one byte
// from the original `Buffer`.

const buf1 = Buffer.allocUnsafe(26);

for (let i = 0; i < 26; i++) {
  // 97 is the decimal ASCII value for 'a'.
  buf1[i] = i + 97;
}

const buf2 = buf1.subarray(0, 3);

console.log(buf2.toString('ascii', 0, buf2.length));
// Prints: abc

buf1[0] = 33;

console.log(buf2.toString('ascii', 0, buf2.length));
// Prints: !bcconst { Buffer } = require('node:buffer');

// Create a `Buffer` with the ASCII alphabet, take a slice, and modify one byte
// from the original `Buffer`.

const buf1 = Buffer.allocUnsafe(26);

for (let i = 0; i < 26; i++) {
  // 97 is the decimal ASCII value for 'a'.
  buf1[i] = i + 97;
}

const buf2 = buf1.subarray(0, 3);

console.log(buf2.toString('ascii', 0, buf2.length));
// Prints: abc

buf1[0] = 33;

console.log(buf2.toString('ascii', 0, buf2.length));
// Prints: !bc

指定负索引会导致切片相对于buf的末尾而不是开头生成。

import { Buffer } from 'node:buffer';

const buf = Buffer.from('buffer');

console.log(buf.subarray(-6, -1).toString());
// Prints: buffe
// (Equivalent to buf.subarray(0, 5).)

console.log(buf.subarray(-6, -2).toString());
// Prints: buff
// (Equivalent to buf.subarray(0, 4).)

console.log(buf.subarray(-5, -2).toString());
// Prints: uff
// (Equivalent to buf.subarray(1, 4).)const { Buffer } = require('node:buffer');

const buf = Buffer.from('buffer');

console.log(buf.subarray(-6, -1).toString());
// Prints: buffe
// (Equivalent to buf.subarray(0, 5).)

console.log(buf.subarray(-6, -2).toString());
// Prints: buff
// (Equivalent to buf.subarray(0, 4).)

console.log(buf.subarray(-5, -2).toString());
// Prints: uff
// (Equivalent to buf.subarray(1, 4).)

buf.slice([start[, end]])#

稳定性:0 - 已弃用:请改用 buf.subarray

返回一个新的 Buffer,它引用与原始 Buffer 相同的内存,但被 startend 索引偏移和裁剪。

此方法与Uint8Array.prototype.slice()不兼容,后者是Buffer的超类。要复制切片,请使用Uint8Array.prototype.slice()

import { Buffer } from 'node:buffer';

const buf = Buffer.from('buffer');

const copiedBuf = Uint8Array.prototype.slice.call(buf);
copiedBuf[0]++;
console.log(copiedBuf.toString());
// Prints: cuffer

console.log(buf.toString());
// Prints: buffer

// With buf.slice(), the original buffer is modified.
const notReallyCopiedBuf = buf.slice();
notReallyCopiedBuf[0]++;
console.log(notReallyCopiedBuf.toString());
// Prints: cuffer
console.log(buf.toString());
// Also prints: cuffer (!)const { Buffer } = require('node:buffer');

const buf = Buffer.from('buffer');

const copiedBuf = Uint8Array.prototype.slice.call(buf);
copiedBuf[0]++;
console.log(copiedBuf.toString());
// Prints: cuffer

console.log(buf.toString());
// Prints: buffer

// With buf.slice(), the original buffer is modified.
const notReallyCopiedBuf = buf.slice();
notReallyCopiedBuf[0]++;
console.log(notReallyCopiedBuf.toString());
// Prints: cuffer
console.log(buf.toString());
// Also prints: cuffer (!)

buf.swap16()#

  • 返回值: <Buffer>buf 的引用。

buf解释为无符号 16 位整数数组,并就地交换字节顺序。如果buf.length不是 2 的倍数,则抛出ERR_INVALID_BUFFER_SIZE

import { Buffer } from 'node:buffer';

const buf1 = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8]);

console.log(buf1);
// Prints: <Buffer 01 02 03 04 05 06 07 08>

buf1.swap16();

console.log(buf1);
// Prints: <Buffer 02 01 04 03 06 05 08 07>

const buf2 = Buffer.from([0x1, 0x2, 0x3]);

buf2.swap16();
// Throws ERR_INVALID_BUFFER_SIZE.const { Buffer } = require('node:buffer');

const buf1 = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8]);

console.log(buf1);
// Prints: <Buffer 01 02 03 04 05 06 07 08>

buf1.swap16();

console.log(buf1);
// Prints: <Buffer 02 01 04 03 06 05 08 07>

const buf2 = Buffer.from([0x1, 0x2, 0x3]);

buf2.swap16();
// Throws ERR_INVALID_BUFFER_SIZE.

buf.swap16()的一个方便用途是在 UTF-16 小端和 UTF-16 大端之间执行快速就地转换。

import { Buffer } from 'node:buffer';

const buf = Buffer.from('This is little-endian UTF-16', 'utf16le');
buf.swap16(); // Convert to big-endian UTF-16 text.const { Buffer } = require('node:buffer');

const buf = Buffer.from('This is little-endian UTF-16', 'utf16le');
buf.swap16(); // Convert to big-endian UTF-16 text.

buf.swap32()#

  • 返回值: <Buffer>buf 的引用。

buf解释为无符号 32 位整数数组,并就地交换字节顺序。如果buf.length不是 4 的倍数,则抛出ERR_INVALID_BUFFER_SIZE

import { Buffer } from 'node:buffer';

const buf1 = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8]);

console.log(buf1);
// Prints: <Buffer 01 02 03 04 05 06 07 08>

buf1.swap32();

console.log(buf1);
// Prints: <Buffer 04 03 02 01 08 07 06 05>

const buf2 = Buffer.from([0x1, 0x2, 0x3]);

buf2.swap32();
// Throws ERR_INVALID_BUFFER_SIZE.const { Buffer } = require('node:buffer');

const buf1 = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8]);

console.log(buf1);
// Prints: <Buffer 01 02 03 04 05 06 07 08>

buf1.swap32();

console.log(buf1);
// Prints: <Buffer 04 03 02 01 08 07 06 05>

const buf2 = Buffer.from([0x1, 0x2, 0x3]);

buf2.swap32();
// Throws ERR_INVALID_BUFFER_SIZE.

buf.swap64()#

  • 返回值: <Buffer>buf 的引用。

buf解释为 64 位数字数组,并就地交换字节顺序。如果buf.length不是 8 的倍数,则抛出ERR_INVALID_BUFFER_SIZE

import { Buffer } from 'node:buffer';

const buf1 = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8]);

console.log(buf1);
// Prints: <Buffer 01 02 03 04 05 06 07 08>

buf1.swap64();

console.log(buf1);
// Prints: <Buffer 08 07 06 05 04 03 02 01>

const buf2 = Buffer.from([0x1, 0x2, 0x3]);

buf2.swap64();
// Throws ERR_INVALID_BUFFER_SIZE.const { Buffer } = require('node:buffer');

const buf1 = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8]);

console.log(buf1);
// Prints: <Buffer 01 02 03 04 05 06 07 08>

buf1.swap64();

console.log(buf1);
// Prints: <Buffer 08 07 06 05 04 03 02 01>

const buf2 = Buffer.from([0x1, 0x2, 0x3]);

buf2.swap64();
// Throws ERR_INVALID_BUFFER_SIZE.

buf.toJSON()#

返回buf的 JSON 表示形式。当对Buffer实例进行字符串化时,JSON.stringify()会隐式调用此函数。

Buffer.from() 接受此方法返回的格式的对象。特别是,Buffer.from(buf.toJSON()) 的工作方式类似于 Buffer.from(buf)

import { Buffer } from 'node:buffer';

const buf = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]);
const json = JSON.stringify(buf);

console.log(json);
// Prints: {"type":"Buffer","data":[1,2,3,4,5]}

const copy = JSON.parse(json, (key, value) => {
  return value && value.type === 'Buffer' ?
    Buffer.from(value) :
    value;
});

console.log(copy);
// Prints: <Buffer 01 02 03 04 05>const { Buffer } = require('node:buffer');

const buf = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]);
const json = JSON.stringify(buf);

console.log(json);
// Prints: {"type":"Buffer","data":[1,2,3,4,5]}

const copy = JSON.parse(json, (key, value) => {
  return value && value.type === 'Buffer' ?
    Buffer.from(value) :
    value;
});

console.log(copy);
// Prints: <Buffer 01 02 03 04 05>

buf.toString([encoding[, start[, end]]])#

  • encoding <string> 要使用的字符编码。默认值: 'utf8'
  • start <integer> 开始解码的字节偏移量。默认值: 0
  • end <integer> 停止解码的字节偏移量(不包括)。默认值: buf.length.
  • 返回值: <string>

根据 encoding 中指定的字符编码,将 buf 解码为字符串。可以传递 startend 来仅解码 buf 的子集。

如果 encoding'utf8' 并且输入中的字节序列不是有效的 UTF-8,则每个无效字节将被替换为替换字符 U+FFFD

字符串实例的最大长度(以 UTF-16 代码单元为单位)可作为 buffer.constants.MAX_STRING_LENGTH 获得。

import { Buffer } from 'node:buffer';

const buf1 = Buffer.allocUnsafe(26);

for (let i = 0; i < 26; i++) {
  // 97 is the decimal ASCII value for 'a'.
  buf1[i] = i + 97;
}

console.log(buf1.toString('utf8'));
// Prints: abcdefghijklmnopqrstuvwxyz
console.log(buf1.toString('utf8', 0, 5));
// Prints: abcde

const buf2 = Buffer.from('tést');

console.log(buf2.toString('hex'));
// Prints: 74c3a97374
console.log(buf2.toString('utf8', 0, 3));
// Prints: té
console.log(buf2.toString(undefined, 0, 3));
// Prints: téconst { Buffer } = require('node:buffer');

const buf1 = Buffer.allocUnsafe(26);

for (let i = 0; i < 26; i++) {
  // 97 is the decimal ASCII value for 'a'.
  buf1[i] = i + 97;
}

console.log(buf1.toString('utf8'));
// Prints: abcdefghijklmnopqrstuvwxyz
console.log(buf1.toString('utf8', 0, 5));
// Prints: abcde

const buf2 = Buffer.from('tést');

console.log(buf2.toString('hex'));
// Prints: 74c3a97374
console.log(buf2.toString('utf8', 0, 3));
// Prints: té
console.log(buf2.toString(undefined, 0, 3));
// Prints: té

buf.values()#

buf 值(字节)创建并返回一个 迭代器。当 Bufferfor..of 语句中使用时,此函数会自动调用。

import { Buffer } from 'node:buffer';

const buf = Buffer.from('buffer');

for (const value of buf.values()) {
  console.log(value);
}
// Prints:
//   98
//   117
//   102
//   102
//   101
//   114

for (const value of buf) {
  console.log(value);
}
// Prints:
//   98
//   117
//   102
//   102
//   101
//   114const { Buffer } = require('node:buffer');

const buf = Buffer.from('buffer');

for (const value of buf.values()) {
  console.log(value);
}
// Prints:
//   98
//   117
//   102
//   102
//   101
//   114

for (const value of buf) {
  console.log(value);
}
// Prints:
//   98
//   117
//   102
//   102
//   101
//   114

buf.write(string[, offset[, length]][, encoding])#

  • string <string> 要写入 buf 的字符串。
  • offset <integer> 开始写入 string 之前要跳过的字节数。默认值: 0
  • length <整数> 要写入的最大字节数(写入的字节数不会超过 buf.length - offset)。默认值: buf.length - offset
  • encoding <字符串> string 的字符编码。默认值: 'utf8'
  • 返回值: <整数> 写入的字节数。

根据 encoding 中的字符编码,将 string 写入 buf 中的 offset 位置。length 参数是要写入的字节数。如果 buf 中没有足够的空间来容纳整个字符串,则只会写入 string 的一部分。但是,不会写入部分编码的字符。

import { Buffer } from 'node:buffer';

const buf = Buffer.alloc(256);

const len = buf.write('\u00bd + \u00bc = \u00be', 0);

console.log(`${len} bytes: ${buf.toString('utf8', 0, len)}`);
// Prints: 12 bytes: ½ + ¼ = ¾

const buffer = Buffer.alloc(10);

const length = buffer.write('abcd', 8);

console.log(`${length} bytes: ${buffer.toString('utf8', 8, 10)}`);
// Prints: 2 bytes : abconst { Buffer } = require('node:buffer');

const buf = Buffer.alloc(256);

const len = buf.write('\u00bd + \u00bc = \u00be', 0);

console.log(`${len} bytes: ${buf.toString('utf8', 0, len)}`);
// Prints: 12 bytes: ½ + ¼ = ¾

const buffer = Buffer.alloc(10);

const length = buffer.write('abcd', 8);

console.log(`${length} bytes: ${buffer.toString('utf8', 8, 10)}`);
// Prints: 2 bytes : ab

buf.writeBigInt64BE(value[, offset])#

  • value <大整数> 要写入 buf 的数字。
  • offset <整数> 开始写入之前要跳过的字节数。必须满足:0 <= offset <= buf.length - 8默认值: 0
  • 返回值: <整数> offset 加上写入的字节数。

以大端序将 value 写入 buf 中指定的 offset 位置。

value 被解释并写入为二进制补码有符号整数。

import { Buffer } from 'node:buffer';

const buf = Buffer.allocUnsafe(8);

buf.writeBigInt64BE(0x0102030405060708n, 0);

console.log(buf);
// Prints: <Buffer 01 02 03 04 05 06 07 08>const { Buffer } = require('node:buffer');

const buf = Buffer.allocUnsafe(8);

buf.writeBigInt64BE(0x0102030405060708n, 0);

console.log(buf);
// Prints: <Buffer 01 02 03 04 05 06 07 08>

buf.writeBigInt64LE(value[, offset])#

  • value <大整数> 要写入 buf 的数字。
  • offset <整数> 开始写入之前要跳过的字节数。必须满足:0 <= offset <= buf.length - 8默认值: 0
  • 返回值: <整数> offset 加上写入的字节数。

以小端序将 value 写入 buf 中指定的 offset 位置。

value 被解释并写入为二进制补码有符号整数。

import { Buffer } from 'node:buffer';

const buf = Buffer.allocUnsafe(8);

buf.writeBigInt64LE(0x0102030405060708n, 0);

console.log(buf);
// Prints: <Buffer 08 07 06 05 04 03 02 01>const { Buffer } = require('node:buffer');

const buf = Buffer.allocUnsafe(8);

buf.writeBigInt64LE(0x0102030405060708n, 0);

console.log(buf);
// Prints: <Buffer 08 07 06 05 04 03 02 01>

buf.writeBigUInt64BE(value[, offset])#

  • value <大整数> 要写入 buf 的数字。
  • offset <整数> 开始写入之前要跳过的字节数。必须满足:0 <= offset <= buf.length - 8默认值: 0
  • 返回值: <整数> offset 加上写入的字节数。

以大端序将 value 写入 buf 中指定的 offset 位置。

此函数也可以使用 writeBigUint64BE 别名。

import { Buffer } from 'node:buffer';

const buf = Buffer.allocUnsafe(8);

buf.writeBigUInt64BE(0xdecafafecacefaden, 0);

console.log(buf);
// Prints: <Buffer de ca fa fe ca ce fa de>const { Buffer } = require('node:buffer');

const buf = Buffer.allocUnsafe(8);

buf.writeBigUInt64BE(0xdecafafecacefaden, 0);

console.log(buf);
// Prints: <Buffer de ca fa fe ca ce fa de>

buf.writeBigUInt64LE(value[, offset])#

  • value <大整数> 要写入 buf 的数字。
  • offset <整数> 开始写入之前要跳过的字节数。必须满足:0 <= offset <= buf.length - 8默认值: 0
  • 返回值: <整数> offset 加上写入的字节数。

以小端序将 value 写入 buf 中指定的 offset 位置

import { Buffer } from 'node:buffer';

const buf = Buffer.allocUnsafe(8);

buf.writeBigUInt64LE(0xdecafafecacefaden, 0);

console.log(buf);
// Prints: <Buffer de fa ce ca fe fa ca de>const { Buffer } = require('node:buffer');

const buf = Buffer.allocUnsafe(8);

buf.writeBigUInt64LE(0xdecafafecacefaden, 0);

console.log(buf);
// Prints: <Buffer de fa ce ca fe fa ca de>

此函数也可以使用 writeBigUint64LE 别名。

buf.writeDoubleBE(value[, offset])#

  • value <数字> 要写入 buf 的数字。
  • offset <整数> 开始写入之前要跳过的字节数。必须满足 0 <= offset <= buf.length - 8默认值: 0
  • 返回值: <整数> offset 加上写入的字节数。

以大端序将 value 写入 buf 中指定的 offset 位置。value 必须是 JavaScript 数字。当 value 不是 JavaScript 数字时,行为未定义。

import { Buffer } from 'node:buffer';

const buf = Buffer.allocUnsafe(8);

buf.writeDoubleBE(123.456, 0);

console.log(buf);
// Prints: <Buffer 40 5e dd 2f 1a 9f be 77>const { Buffer } = require('node:buffer');

const buf = Buffer.allocUnsafe(8);

buf.writeDoubleBE(123.456, 0);

console.log(buf);
// Prints: <Buffer 40 5e dd 2f 1a 9f be 77>

buf.writeDoubleLE(value[, offset])#

  • value <数字> 要写入 buf 的数字。
  • offset <整数> 开始写入之前要跳过的字节数。必须满足 0 <= offset <= buf.length - 8默认值: 0
  • 返回值: <整数> offset 加上写入的字节数。

value 以小端序写入 buf 中指定的 offset 位置。value 必须是 JavaScript 数字。当 value 不是 JavaScript 数字时,行为未定义。

import { Buffer } from 'node:buffer';

const buf = Buffer.allocUnsafe(8);

buf.writeDoubleLE(123.456, 0);

console.log(buf);
// Prints: <Buffer 77 be 9f 1a 2f dd 5e 40>const { Buffer } = require('node:buffer');

const buf = Buffer.allocUnsafe(8);

buf.writeDoubleLE(123.456, 0);

console.log(buf);
// Prints: <Buffer 77 be 9f 1a 2f dd 5e 40>

buf.writeFloatBE(value[, offset])#

  • value <数字> 要写入 buf 的数字。
  • offset <integer> 开始写入之前要跳过的字节数。必须满足 0 <= offset <= buf.length - 4默认值: 0
  • 返回值: <整数> offset 加上写入的字节数。

value 以大端序写入 buf 中指定的 offset 位置。当 value 不是 JavaScript 数字时,行为未定义。

import { Buffer } from 'node:buffer';

const buf = Buffer.allocUnsafe(4);

buf.writeFloatBE(0xcafebabe, 0);

console.log(buf);
// Prints: <Buffer 4f 4a fe bb>const { Buffer } = require('node:buffer');

const buf = Buffer.allocUnsafe(4);

buf.writeFloatBE(0xcafebabe, 0);

console.log(buf);
// Prints: <Buffer 4f 4a fe bb>

buf.writeFloatLE(value[, offset])#

  • value <数字> 要写入 buf 的数字。
  • offset <integer> 开始写入之前要跳过的字节数。必须满足 0 <= offset <= buf.length - 4默认值: 0
  • 返回值: <整数> offset 加上写入的字节数。

value 以小端序写入 buf 中指定的 offset 位置。当 value 不是 JavaScript 数字时,行为未定义。

import { Buffer } from 'node:buffer';

const buf = Buffer.allocUnsafe(4);

buf.writeFloatLE(0xcafebabe, 0);

console.log(buf);
// Prints: <Buffer bb fe 4a 4f>const { Buffer } = require('node:buffer');

const buf = Buffer.allocUnsafe(4);

buf.writeFloatLE(0xcafebabe, 0);

console.log(buf);
// Prints: <Buffer bb fe 4a 4f>

buf.writeInt8(value[, offset])#

  • value <integer> 要写入 buf 的数字。
  • offset <integer> 开始写入之前要跳过的字节数。必须满足 0 <= offset <= buf.length - 1默认值: 0
  • 返回值: <整数> offset 加上写入的字节数。

value 写入 buf 中指定的 offset 位置。value 必须是有效的有符号 8 位整数。当 value 不是有符号 8 位整数时,行为未定义。

value 被解释并写入为二进制补码有符号整数。

import { Buffer } from 'node:buffer';

const buf = Buffer.allocUnsafe(2);

buf.writeInt8(2, 0);
buf.writeInt8(-2, 1);

console.log(buf);
// Prints: <Buffer 02 fe>const { Buffer } = require('node:buffer');

const buf = Buffer.allocUnsafe(2);

buf.writeInt8(2, 0);
buf.writeInt8(-2, 1);

console.log(buf);
// Prints: <Buffer 02 fe>

buf.writeInt16BE(value[, offset])#

  • value <integer> 要写入 buf 的数字。
  • offset <integer> 开始写入之前要跳过的字节数。必须满足 0 <= offset <= buf.length - 2默认值: 0
  • 返回值: <整数> offset 加上写入的字节数。

value 以大端序写入 buf 中指定的 offset 位置。value 必须是有效的有符号 16 位整数。当 value 不是有符号 16 位整数时,行为未定义。

value 被解释并写入为二进制补码有符号整数。

import { Buffer } from 'node:buffer';

const buf = Buffer.allocUnsafe(2);

buf.writeInt16BE(0x0102, 0);

console.log(buf);
// Prints: <Buffer 01 02>const { Buffer } = require('node:buffer');

const buf = Buffer.allocUnsafe(2);

buf.writeInt16BE(0x0102, 0);

console.log(buf);
// Prints: <Buffer 01 02>

buf.writeInt16LE(value[, offset])#

  • value <integer> 要写入 buf 的数字。
  • offset <integer> 开始写入之前要跳过的字节数。必须满足 0 <= offset <= buf.length - 2默认值: 0
  • 返回值: <整数> offset 加上写入的字节数。

value 以小端序写入 buf 中指定的 offset 位置。value 必须是有效的有符号 16 位整数。当 value 不是有符号 16 位整数时,行为未定义。

value 被解释并写入为二进制补码有符号整数。

import { Buffer } from 'node:buffer';

const buf = Buffer.allocUnsafe(2);

buf.writeInt16LE(0x0304, 0);

console.log(buf);
// Prints: <Buffer 04 03>const { Buffer } = require('node:buffer');

const buf = Buffer.allocUnsafe(2);

buf.writeInt16LE(0x0304, 0);

console.log(buf);
// Prints: <Buffer 04 03>

buf.writeInt32BE(value[, offset])#

  • value <integer> 要写入 buf 的数字。
  • offset <integer> 开始写入之前要跳过的字节数。必须满足 0 <= offset <= buf.length - 4默认值: 0
  • 返回值: <整数> offset 加上写入的字节数。

value 以大端序写入 buf 中指定的 offset 位置。value 必须是有效的有符号 32 位整数。当 value 不是有符号 32 位整数时,行为未定义。

value 被解释并写入为二进制补码有符号整数。

import { Buffer } from 'node:buffer';

const buf = Buffer.allocUnsafe(4);

buf.writeInt32BE(0x01020304, 0);

console.log(buf);
// Prints: <Buffer 01 02 03 04>const { Buffer } = require('node:buffer');

const buf = Buffer.allocUnsafe(4);

buf.writeInt32BE(0x01020304, 0);

console.log(buf);
// Prints: <Buffer 01 02 03 04>

buf.writeInt32LE(value[, offset])#

  • value <integer> 要写入 buf 的数字。
  • offset <integer> 开始写入之前要跳过的字节数。必须满足 0 <= offset <= buf.length - 4默认值: 0
  • 返回值: <整数> offset 加上写入的字节数。

value 以小端序写入 buf 中指定的 offset 位置。value 必须是有效的有符号 32 位整数。当 value 不是有符号 32 位整数时,行为未定义。

value 被解释并写入为二进制补码有符号整数。

import { Buffer } from 'node:buffer';

const buf = Buffer.allocUnsafe(4);

buf.writeInt32LE(0x05060708, 0);

console.log(buf);
// Prints: <Buffer 08 07 06 05>const { Buffer } = require('node:buffer');

const buf = Buffer.allocUnsafe(4);

buf.writeInt32LE(0x05060708, 0);

console.log(buf);
// Prints: <Buffer 08 07 06 05>

buf.writeIntBE(value, offset, byteLength)#

  • value <integer> 要写入 buf 的数字。
  • offset <integer> 开始写入之前要跳过的字节数。必须满足 0 <= offset <= buf.length - byteLength
  • byteLength <integer> 要写入的字节数。必须满足 0 < byteLength <= 6
  • 返回值: <整数> offset 加上写入的字节数。

valuebyteLength 个字节以大端序写入 buf 中指定的 offset 位置。支持高达 48 位的精度。当 value 不是有符号整数时,行为未定义。

import { Buffer } from 'node:buffer';

const buf = Buffer.allocUnsafe(6);

buf.writeIntBE(0x1234567890ab, 0, 6);

console.log(buf);
// Prints: <Buffer 12 34 56 78 90 ab>const { Buffer } = require('node:buffer');

const buf = Buffer.allocUnsafe(6);

buf.writeIntBE(0x1234567890ab, 0, 6);

console.log(buf);
// Prints: <Buffer 12 34 56 78 90 ab>

buf.writeIntLE(value, offset, byteLength)#

  • value <integer> 要写入 buf 的数字。
  • offset <integer> 开始写入之前要跳过的字节数。必须满足 0 <= offset <= buf.length - byteLength
  • byteLength <integer> 要写入的字节数。必须满足 0 < byteLength <= 6
  • 返回值: <整数> offset 加上写入的字节数。

valuebyteLength 个字节以小端序写入 buf 中指定的 offset 位置。支持高达 48 位的精度。当 value 不是有符号整数时,行为未定义。

import { Buffer } from 'node:buffer';

const buf = Buffer.allocUnsafe(6);

buf.writeIntLE(0x1234567890ab, 0, 6);

console.log(buf);
// Prints: <Buffer ab 90 78 56 34 12>const { Buffer } = require('node:buffer');

const buf = Buffer.allocUnsafe(6);

buf.writeIntLE(0x1234567890ab, 0, 6);

console.log(buf);
// Prints: <Buffer ab 90 78 56 34 12>

buf.writeUInt8(value[, offset])#

  • value <integer> 要写入 buf 的数字。
  • offset <integer> 开始写入之前要跳过的字节数。必须满足 0 <= offset <= buf.length - 1默认值: 0
  • 返回值: <整数> offset 加上写入的字节数。

value 写入 buf 中指定的 offset 位置。value 必须是有效的无符号 8 位整数。当 value 不是无符号 8 位整数时,行为未定义。

此函数也可以使用 writeUint8 别名。

import { Buffer } from 'node:buffer';

const buf = Buffer.allocUnsafe(4);

buf.writeUInt8(0x3, 0);
buf.writeUInt8(0x4, 1);
buf.writeUInt8(0x23, 2);
buf.writeUInt8(0x42, 3);

console.log(buf);
// Prints: <Buffer 03 04 23 42>const { Buffer } = require('node:buffer');

const buf = Buffer.allocUnsafe(4);

buf.writeUInt8(0x3, 0);
buf.writeUInt8(0x4, 1);
buf.writeUInt8(0x23, 2);
buf.writeUInt8(0x42, 3);

console.log(buf);
// Prints: <Buffer 03 04 23 42>

buf.writeUInt16BE(value[, offset])#

  • value <integer> 要写入 buf 的数字。
  • offset <integer> 开始写入之前要跳过的字节数。必须满足 0 <= offset <= buf.length - 2默认值: 0
  • 返回值: <整数> offset 加上写入的字节数。

value以大端序写入到指定offset处的buf中。value必须是一个有效的无符号 16 位整数。当value不是无符号 16 位整数时,行为未定义。

此函数也可用别名writeUint16BE访问。

import { Buffer } from 'node:buffer';

const buf = Buffer.allocUnsafe(4);

buf.writeUInt16BE(0xdead, 0);
buf.writeUInt16BE(0xbeef, 2);

console.log(buf);
// Prints: <Buffer de ad be ef>const { Buffer } = require('node:buffer');

const buf = Buffer.allocUnsafe(4);

buf.writeUInt16BE(0xdead, 0);
buf.writeUInt16BE(0xbeef, 2);

console.log(buf);
// Prints: <Buffer de ad be ef>

buf.writeUInt16LE(value[, offset])#

  • value <integer> 要写入 buf 的数字。
  • offset <integer> 开始写入之前要跳过的字节数。必须满足 0 <= offset <= buf.length - 2默认值: 0
  • 返回值: <整数> offset 加上写入的字节数。

value以小端序写入到指定offset处的buf中。value必须是一个有效的无符号 16 位整数。当value不是无符号 16 位整数时,行为未定义。

此函数也可用别名writeUint16LE访问。

import { Buffer } from 'node:buffer';

const buf = Buffer.allocUnsafe(4);

buf.writeUInt16LE(0xdead, 0);
buf.writeUInt16LE(0xbeef, 2);

console.log(buf);
// Prints: <Buffer ad de ef be>const { Buffer } = require('node:buffer');

const buf = Buffer.allocUnsafe(4);

buf.writeUInt16LE(0xdead, 0);
buf.writeUInt16LE(0xbeef, 2);

console.log(buf);
// Prints: <Buffer ad de ef be>

buf.writeUInt32BE(value[, offset])#

  • value <integer> 要写入 buf 的数字。
  • offset <integer> 开始写入之前要跳过的字节数。必须满足 0 <= offset <= buf.length - 4默认值: 0
  • 返回值: <整数> offset 加上写入的字节数。

value以大端序写入到指定offset处的buf中。value必须是一个有效的无符号 32 位整数。当value不是无符号 32 位整数时,行为未定义。

此函数也可用别名writeUint32BE访问。

import { Buffer } from 'node:buffer';

const buf = Buffer.allocUnsafe(4);

buf.writeUInt32BE(0xfeedface, 0);

console.log(buf);
// Prints: <Buffer fe ed fa ce>const { Buffer } = require('node:buffer');

const buf = Buffer.allocUnsafe(4);

buf.writeUInt32BE(0xfeedface, 0);

console.log(buf);
// Prints: <Buffer fe ed fa ce>

buf.writeUInt32LE(value[, offset])#

  • value <integer> 要写入 buf 的数字。
  • offset <integer> 开始写入之前要跳过的字节数。必须满足 0 <= offset <= buf.length - 4默认值: 0
  • 返回值: <整数> offset 加上写入的字节数。

value以小端序写入到指定offset处的buf中。value必须是一个有效的无符号 32 位整数。当value不是无符号 32 位整数时,行为未定义。

此函数也可用别名writeUint32LE访问。

import { Buffer } from 'node:buffer';

const buf = Buffer.allocUnsafe(4);

buf.writeUInt32LE(0xfeedface, 0);

console.log(buf);
// Prints: <Buffer ce fa ed fe>const { Buffer } = require('node:buffer');

const buf = Buffer.allocUnsafe(4);

buf.writeUInt32LE(0xfeedface, 0);

console.log(buf);
// Prints: <Buffer ce fa ed fe>

buf.writeUIntBE(value, offset, byteLength)#

  • value <integer> 要写入 buf 的数字。
  • offset <integer> 开始写入之前要跳过的字节数。必须满足 0 <= offset <= buf.length - byteLength
  • byteLength <integer> 要写入的字节数。必须满足 0 < byteLength <= 6
  • 返回值: <整数> offset 加上写入的字节数。

valuebyteLength 字节以大端序写入 buf 中指定的 offset 位置。支持高达 48 位的精度。当 value 不是无符号整数时,行为未定义。

此函数也以 writeUintBE 别名提供。

import { Buffer } from 'node:buffer';

const buf = Buffer.allocUnsafe(6);

buf.writeUIntBE(0x1234567890ab, 0, 6);

console.log(buf);
// Prints: <Buffer 12 34 56 78 90 ab>const { Buffer } = require('node:buffer');

const buf = Buffer.allocUnsafe(6);

buf.writeUIntBE(0x1234567890ab, 0, 6);

console.log(buf);
// Prints: <Buffer 12 34 56 78 90 ab>

buf.writeUIntLE(value, offset, byteLength)#

  • value <integer> 要写入 buf 的数字。
  • offset <integer> 开始写入之前要跳过的字节数。必须满足 0 <= offset <= buf.length - byteLength
  • byteLength <integer> 要写入的字节数。必须满足 0 < byteLength <= 6
  • 返回值: <整数> offset 加上写入的字节数。

valuebyteLength 字节以小端序写入 buf 中指定的 offset 位置。支持高达 48 位的精度。当 value 不是无符号整数时,行为未定义。

此函数也以 writeUintLE 别名提供。

import { Buffer } from 'node:buffer';

const buf = Buffer.allocUnsafe(6);

buf.writeUIntLE(0x1234567890ab, 0, 6);

console.log(buf);
// Prints: <Buffer ab 90 78 56 34 12>const { Buffer } = require('node:buffer');

const buf = Buffer.allocUnsafe(6);

buf.writeUIntLE(0x1234567890ab, 0, 6);

console.log(buf);
// Prints: <Buffer ab 90 78 56 34 12>

new Buffer(array)#

稳定性:0 - 已弃用:请使用 Buffer.from(array) 代替。

请参阅 Buffer.from(array)

new Buffer(arrayBuffer[, byteOffset[, length]])#

请参阅 Buffer.from(arrayBuffer[, byteOffset[, length]])

new Buffer(buffer)#

稳定性: 0 - 已弃用: 请使用 Buffer.from(buffer) 代替。

参见 Buffer.from(buffer).

new Buffer(size)#

稳定性: 0 - 已弃用: 请使用 Buffer.alloc() 代替(另请参见 Buffer.allocUnsafe())。

  • size <整数>Buffer 的所需长度。

参见 Buffer.alloc()Buffer.allocUnsafe()。此构造函数变体等效于 Buffer.alloc().

new Buffer(string[, encoding])#

稳定性: 0 - 已弃用: 请使用 Buffer.from(string[, encoding]) 代替。

  • string <string> 要编码的字符串。
  • encoding <string> string 的编码。默认:'utf8'

参见 Buffer.from(string[, encoding]).

类: File#

File 提供有关文件的信息。

new buffer.File(sources, fileName[, options])#

file.name#

File 的名称。

file.lastModified#

File 的最后修改日期。

node:buffer 模块 API#

虽然 Buffer 对象作为全局对象可用,但还有一些其他与 Buffer 相关的 API 只能通过 node:buffer 模块使用 require('node:buffer') 访问。

buffer.atob(data)#

稳定性: 3 - 遗留。请改用 Buffer.from(data, 'base64')

  • data <any> Base64 编码的输入字符串。

将 Base64 编码的数据字符串解码为字节,并将这些字节使用 Latin-1 (ISO-8859-1) 编码为字符串。

data 可以是任何可以强制转换为字符串的 JavaScript 值。

此函数仅为了与旧版 Web 平台 API 保持兼容性而提供,不应在新的代码中使用,因为它们使用字符串来表示二进制数据,并且早于 JavaScript 中引入类型化数组。对于使用 Node.js API 运行的代码,应使用 Buffer.from(str, 'base64')buf.toString('base64') 在 base64 编码的字符串和二进制数据之间进行转换。

buffer.btoa(data)#

稳定性: 3 - 遗留。请改用 buf.toString('base64')

  • data <any> ASCII (Latin1) 字符串。

使用 Latin-1 (ISO-8859) 将字符串解码为字节,并将这些字节使用 Base64 编码为字符串。

data 可以是任何可以强制转换为字符串的 JavaScript 值。

此函数仅为了与旧版 Web 平台 API 保持兼容性而提供,不应在新的代码中使用,因为它们使用字符串来表示二进制数据,并且早于 JavaScript 中引入类型化数组。对于使用 Node.js API 运行的代码,应使用 Buffer.from(str, 'base64')buf.toString('base64') 在 base64 编码的字符串和二进制数据之间进行转换。

buffer.isAscii(input)#

如果 input 仅包含有效的 ASCII 编码数据(包括 input 为空的情况),则此函数返回 true

如果 input 是分离的数组缓冲区,则抛出异常。

buffer.isUtf8(input)#

如果 input 仅包含有效的 UTF-8 编码数据(包括 input 为空的情况),则此函数返回 true

如果 input 是分离的数组缓冲区,则抛出异常。

buffer.INSPECT_MAX_BYTES#

返回调用 buf.inspect() 时将返回的最大字节数。这可以被用户模块覆盖。有关 buf.inspect() 行为的更多详细信息,请参见 util.inspect()

buffer.kMaxLength#

  • <整数> 单个 Buffer 实例允许的最大大小。

buffer.constants.MAX_LENGTH 的别名。

buffer.kStringMaxLength#

  • <整数> 单个 string 实例允许的最大长度。

buffer.constants.MAX_STRING_LENGTH 的别名。

buffer.resolveObjectURL(id)#

稳定性:1 - 实验性

  • id <字符串> 由先前对 URL.createObjectURL() 的调用返回的 'blob:nodedata:... URL 字符串。
  • 返回值:<Blob>

解析 'blob:nodedata:...' 与使用先前对 URL.createObjectURL() 的调用注册的关联 <Blob> 对象。

buffer.transcode(source, fromEnc, toEnc)#

将给定的 BufferUint8Array 实例从一种字符编码重新编码为另一种。返回一个新的 Buffer 实例。

如果 fromEnctoEnc 指定无效的字符编码,或者不允许从 fromEnctoEnc 的转换,则抛出异常。

buffer.transcode() 支持的编码:'ascii''utf8''utf16le''ucs2''latin1''binary'

如果给定的字节序列无法在目标编码中充分表示,则转码过程将使用替换字符。例如

import { Buffer, transcode } from 'node:buffer';

const newBuf = transcode(Buffer.from('€'), 'utf8', 'ascii');
console.log(newBuf.toString('ascii'));
// Prints: '?'const { Buffer, transcode } = require('node:buffer');

const newBuf = transcode(Buffer.from('€'), 'utf8', 'ascii');
console.log(newBuf.toString('ascii'));
// Prints: '?'

由于欧元符号 () 在 US-ASCII 中无法表示,因此它在转码的 Buffer 中被替换为 ?

类: SlowBuffer#

稳定性: 0 - 已弃用: 请改用 Buffer.allocUnsafeSlow()

参见 Buffer.allocUnsafeSlow()。这从未是一个类,因为构造函数始终返回 Buffer 实例,而不是 SlowBuffer 实例。

new SlowBuffer(size)#

稳定性: 0 - 已弃用: 请改用 Buffer.allocUnsafeSlow()

  • size <整数>SlowBuffer 的所需长度。

参见 Buffer.allocUnsafeSlow().

缓冲区常量#

buffer.constants.MAX_LENGTH#
  • <整数> 单个 Buffer 实例允许的最大大小。

在 32 位架构上,此值目前为 230 - 1(约 1 GiB)。

在 64 位架构上,此值目前为 232(约 4 GiB)。

它反映了底层的 v8::TypedArray::kMaxLength

此值也可以作为 buffer.kMaxLength 获取。

buffer.constants.MAX_STRING_LENGTH#
  • <整数> 单个 string 实例允许的最大长度。

表示 string 原语可以具有的最大 length,以 UTF-16 代码单元计。

此值可能取决于所使用的 JS 引擎。

Buffer.from()Buffer.alloc()Buffer.allocUnsafe()#

在 6.0.0 之前的 Node.js 版本中,Buffer 实例是使用 Buffer 构造函数创建的,该函数根据提供的参数不同地分配返回的 Buffer

  • 将数字作为第一个参数传递给 Buffer()(例如 new Buffer(10))会分配一个指定大小的新 Buffer 对象。在 Node.js 8.0.0 之前,为这些 Buffer 实例分配的内存初始化,并且可能包含敏感数据。此类 Buffer 实例必须随后通过使用 buf.fill(0) 或写入整个 Buffer 来初始化,然后再从 Buffer 读取数据。虽然这种行为是有意的,是为了提高性能,但开发经验表明,在创建快速但未初始化的 Buffer 与创建较慢但更安全的 Buffer 之间需要更明确的区分。从 Node.js 8.0.0 开始,Buffer(num)new Buffer(num) 返回一个具有初始化内存的 Buffer
  • 将字符串、数组或 Buffer 作为第一个参数传递会将传递的对象的数据复制到 Buffer 中。
  • 传递一个 ArrayBuffer 或一个 SharedArrayBuffer 会返回一个与给定数组缓冲区共享分配内存的 Buffer

由于 new Buffer() 的行为取决于第一个参数的类型,因此当未执行参数验证或 Buffer 初始化时,可能会无意中将安全性和可靠性问题引入应用程序。

例如,如果攻击者可以导致应用程序接收一个数字,而预期的是一个字符串,那么应用程序可能会调用new Buffer(100)而不是new Buffer("100"),导致它分配一个100字节的缓冲区,而不是分配一个包含内容"100"的3字节缓冲区。这通常可以通过 JSON API 调用实现。由于 JSON 区分数字和字符串类型,因此它允许在应用程序预期始终接收字符串的情况下注入数字,而这些应用程序的编写过于简单,没有对输入进行充分验证。在 Node.js 8.0.0 之前,100 字节的缓冲区可能包含任意预先存在的内存中数据,因此可能被用来将内存中的秘密暴露给远程攻击者。从 Node.js 8.0.0 开始,内存泄露无法发生,因为数据被零填充。但是,仍然可能发生其他攻击,例如导致服务器分配非常大的缓冲区,从而导致性能下降或因内存耗尽而崩溃。

为了使Buffer实例的创建更加可靠,减少错误,new Buffer()构造函数的各种形式已被弃用,并被单独的Buffer.from()Buffer.alloc()Buffer.allocUnsafe()方法取代。

开发人员应该将所有现有的new Buffer()构造函数的使用迁移到这些新的 API 中。

Buffer.allocUnsafe()Buffer.from(array) 返回的 Buffer 实例可能从共享的内部内存池中分配,前提是 size 小于或等于 Buffer.poolSize 的一半。由 Buffer.allocUnsafeSlow() 返回的实例绝不使用共享的内部内存池。

--zero-fill-buffers 命令行选项#

Node.js 可以使用 --zero-fill-buffers 命令行选项启动,以使所有新分配的 Buffer 实例在创建时默认填充零。如果没有此选项,使用 Buffer.allocUnsafe()Buffer.allocUnsafeSlow()new SlowBuffer(size) 创建的缓冲区不会填充零。使用此标志可能会对性能产生可衡量的负面影响。仅在需要强制新分配的 Buffer 实例不包含可能敏感的旧数据时,才使用 --zero-fill-buffers 选项。

$ node --zero-fill-buffers
> Buffer.allocUnsafe(5);
<Buffer 00 00 00 00 00> 

是什么让 Buffer.allocUnsafe()Buffer.allocUnsafeSlow() 变得“不安全”?#

当调用 Buffer.allocUnsafe()Buffer.allocUnsafeSlow() 时,分配的内存段是未初始化的(它没有被清零)。虽然这种设计使内存分配非常快,但分配的内存段可能包含可能敏感的旧数据。使用由 Buffer.allocUnsafe() 创建的 Buffer 而不完全覆盖内存,可能会导致在读取 Buffer 内存时泄漏这些旧数据。

虽然使用 Buffer.allocUnsafe() 有明显的性能优势,但必须格外小心,以避免在应用程序中引入安全漏洞。