2、Buffer

Buffer简介

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

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

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

Buffer 使用

创建 Buffer

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 目前支持的字符编码包括:

写入缓冲区

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

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

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

从缓冲区读取数据

将 Buffer 转换为字符串

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

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

将 Buffer 转换为 JSON 对象

buf.toJSON()

修改数据

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

缓冲区合并

Buffer.concat(list[, totalLength])
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);
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]]])
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 到 end 的位置剪切。

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

缓冲区长度

buf.length;