跳过正文
  1. 文章/
  2. 前端/
  3. NodeJS/
  4. NodeJS API/

2、Buffer

·1860 字·4 分钟· loading · loading · ·
前端 NodeJS NodeJS API
GradyYoung
作者
GradyYoung
NodeJS API - 点击查看当前系列文章
§ 2、Buffer 「 当前文章 」

Buffer简介
#

JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。

Node.js 中的 Buffer 类是用于处理二进制数据的核心工具,提供了对二进制数据的高效操作。

Buffer 类在处理文件操作、网络通信、图像处理等场景中特别有用。

  • 二进制数据Buffer 对象是一个包含原始二进制数据的固定大小的数组。每个元素占用一个字节(8位),因此 Buffer 适合处理二进制数据,如文件内容、网络数据包等。
  • 不可变性:虽然 Buffer 对象的内容可以在创建后修改,但其长度是固定的,不能动态改变。

Buffer 使用
#

创建 Buffer
#

  • Buffer.alloc(size[, fill[, encoding]]): 创建了一个长度为 size 字节的 Buffer,相当于申请了 size 字节的内存空间,每个字节的值为 0。
  • Buffer.allocUnsafe(size): 建了一个长度为 size 字节的 Buffer,但 Buffer 中可能存在旧的数据,可能会影响执行结果,所以叫 unsafe。
  • Buffer.allocUnsafeSlow(size):用于分配给定大小 size 的新 Buffer 实例,但不对其进行初始化。
  • Buffer.from(array): 返回一个被 array 的值初始化的新的 Buffer 实例(传入的 array 的元素只能是数字,不然就会自动被 0 覆盖)
  • Buffer.from(arrayBuffer[, byteOffset[, length]]): 返回一个新建的与给定的 ArrayBuffer 共享同一内存的 Buffer。
  • Buffer.from(buffer): 复制传入的 Buffer 实例的数据,并返回一个新的 Buffer 实例
  • Buffer.from(string[, encoding]): 通过字符串创建 Buffer,可以指定编码,默认为 UTF-8。

Node.js 中创建 Buffer 的方式主要如下几种:

Buffer.alloc
#

//创建了一个长度为 10 字节的 Buffer,相当于申请了 10 字节的内存空间,每个字节的值为 0
let buf_1 = Buffer.alloc(10); // 结果为 <Buffer 00 00 00 00 00 00 00 00 00 00>

Buffer.allocUnsafe
#

//创建了一个长度为 10 字节的 Buffer,buffer 中可能存在旧的数据, 可能会影响执行结果,所以叫unsafe
let buf_2 = Buffer.allocUnsafe(10);

Buffer.from
#

//通过字符串创建 Buffer,默认为 utf-8
let buf_3 = Buffer.from('hello');
//通过字符串创建 Buffer,按照 ascii 编码
var buf = Buffer.from('hello','ascii')
//通过数组创建 Buffer
let buf_4 = Buffer.from([105, 108, 111, 118, 101, 121, 111, 117]);

Buffer 与字符编码
#

Buffer 实例一般用于表示编码字符的序列,比如 UTF-8 、 UCS2 、 Base64 、或十六进制编码的数据。 通过使用显式的字符编码,就可以在 Buffer 实例与普通的 JavaScript 字符串之间进行相互转换。

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

console.log(buf.toString('hex'));

console.log(buf.toString('base64'));

Node.js 目前支持的字符编码包括:

  • ascii:仅支持 7 位 ASCII 数据。如果设置去掉高位的话,这种编码是非常快的。
  • utf8:多字节编码的 Unicode 字符。许多网页和其他文档格式都使用 UTF-8 。
  • utf16le:2 或 4 个字节,小字节序编码的 Unicode 字符。支持代理对(U+10000 至 U+10FFFF)。
  • ucs2utf16le 的别名。
  • base64:Base64 编码。
  • latin1:一种把 Buffer 编码成一字节编码的字符串的方式。
  • binarylatin1 的别名。
  • hex:将每个字节编码为两个十六进制字符。

写入缓冲区
#

写入 Node 缓冲区的语法如下所示:

buf.write(string[, offset[, length]][, encoding])
  • string:写入缓冲区的字符串。
  • offset:缓冲区开始写入的索引值,默认为 0 。
  • length:写入的字节数,默认为 buffer.length
  • encoding:使用的编码。默认为utf8

根据 encoding 的字符编码写入 string 到 buf 中的 offset 位置。 length 参数是写入的字节数。 如果 buf 没有足够的空间保存整个字符串,则只会写入 string 的一部分。 只部分解码的字符不会被写入。

从缓冲区读取数据
#

将 Buffer 转换为字符串
#

读取 Node 缓冲区数据的语法如下所示:

buf.toString([encoding[, start[, end]]])
  • encoding:使用的编码。默认为utf8
  • start:指定开始读取的索引位置,默认为 0。
  • end:结束位置,默认为缓冲区的末尾。

将 Buffer 转换为 JSON 对象
#

buf.toJSON()

修改数据
#

var buffer1 = Buffer.from('hello');
// 剪切缓冲区
buffer1[0] = 97
console.log(buffer1.toString()) // aello

缓冲区合并
#

Buffer.concat(list[, totalLength])
  • list:用于合并的 Buffer 对象数组列表。
  • totalLength:指定合并后Buffer对象的总长度。
var buffer1 = Buffer.from(('hello'));
var buffer2 = Buffer.from(('world'));
var buffer3 = Buffer.concat([buffer1,buffer2]);
console.log("buffer3 内容: " + buffer3.toString());

缓冲区比较
#

该方法在 Node.js V0.12.2 版本引入

buf.compare(otherBuffer);
  • otherBuffer:与 buf 对象比较的另外一个 Buffer 对象。
var buffer1 = Buffer.from('ABC');
var buffer2 = Buffer.from('ABCD');
var result = buffer1.compare(buffer2);

if(result < 0) {
   console.log(buffer1 + " 在 " + buffer2 + "之前");
}else if(result == 0){
   console.log(buffer1 + " 与 " + buffer2 + "相同");
}else {
   console.log(buffer1 + " 在 " + buffer2 + "之后");
}

拷贝缓冲区
#

buf.copy(targetBuffer[, targetStart[, sourceStart[, sourceEnd]]])
  • targetBuffer:要拷贝的 Buffer 对象。
  • targetStart:数字, 可选, 默认: 0
  • sourceStart:数字, 可选, 默认: 0
  • sourceEnd:数字, 可选, 默认: buffer.length
var buf1 = Buffer.from('abcdefghijkl');
var buf2 = Buffer.from('1234');

//将 buf2 插入到 buf1 指定位置上
buf2.copy(buf1, 2);

console.log(buf1.toString()); // ab1234ghijkl

缓冲区裁剪
#

buf.slice([start[, end]])
  • start:数字, 可选, 默认: 0
  • end:数字, 可选, 默认: buffer.length

返回一个新的缓冲区,它和旧缓冲区指向同一块内存,但是从索引 start 到 end 的位置剪切。

var buffer1 = Buffer.from('hello');
// 剪切缓冲区
var buffer2 = buffer1.slice(0,2);
console.log("buffer2 content: " + buffer2.toString()); // he

缓冲区长度
#

buf.length;
NodeJS API - 点击查看当前系列文章
§ 2、Buffer 「 当前文章 」