JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。
Node.js 中的 Buffer 类是用于处理二进制数据的核心工具,提供了对二进制数据的高效操作。
Buffer 类在处理文件操作、网络通信、图像处理等场景中特别有用。
Buffer
对象是一个包含原始二进制数据的固定大小的数组。每个元素占用一个字节(8位),因此 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 的方式主要如下几种:
//创建了一个长度为 10 字节的 Buffer,相当于申请了 10 字节的内存空间,每个字节的值为 0
let buf_1 = Buffer.alloc(10); // 结果为 <Buffer 00 00 00 00 00 00 00 00 00 00>
//创建了一个长度为 10 字节的 Buffer,buffer 中可能存在旧的数据, 可能会影响执行结果,所以叫unsafe
let buf_2 = Buffer.allocUnsafe(10);
//通过字符串创建 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 实例一般用于表示编码字符的序列,比如 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])
string
:写入缓冲区的字符串。offset
:缓冲区开始写入的索引值,默认为 0 。length
:写入的字节数,默认为 buffer.length
encoding
:使用的编码。默认为utf8
。根据 encoding 的字符编码写入 string 到 buf 中的 offset 位置。 length 参数是写入的字节数。 如果 buf 没有足够的空间保存整个字符串,则只会写入 string 的一部分。 只部分解码的字符不会被写入。
读取 Node 缓冲区数据的语法如下所示:
buf.toString([encoding[, start[, end]]])
encoding
:使用的编码。默认为utf8
。start
:指定开始读取的索引位置,默认为 0。end
:结束位置,默认为缓冲区的末尾。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
:数字, 可选, 默认: 0sourceStart
:数字, 可选, 默认: 0sourceEnd
:数字, 可选, 默认: 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
:数字, 可选, 默认: 0end
:数字, 可选, 默认: buffer.length
返回一个新的缓冲区,它和旧缓冲区指向同一块内存,但是从索引 start 到 end 的位置剪切。
var buffer1 = Buffer.from('hello');
// 剪切缓冲区
var buffer2 = buffer1.slice(0,2);
console.log("buffer2 content: " + buffer2.toString()); // he
buf.length;