Buffer简介
在 ECMAScript 2015 (ES6) 引入 TypedArray
之前,JavaScript 语言没有读取或操作二进制数据流的机制。 Buffer
类被引入作为 Node.js API 的一部分,使其可以在 TCP 流或文件系统操作等场景中处理二进制数据流。
TypedArray
现已被添加进 ES6 中,Buffer
类以一种更优化、更适合 Node.js 用例的方式实现了 Uint8Array
API。
Buffer
类的实例类似于整数数组,但 Buffer
的大小是固定的、且在 V8 堆外分配物理内存。 Buffer
的大小在被创建时确定,且无法调整。
Buffer
类在 Node.js 中是一个全局变量,因此无需使用 require(‘buffer‘).Buffer
。Buffer
中元素为16进制的Number类型,大小为8b
Buffer常用的方法
Buffer.from() 将字符串转换为buffer数据
Buffer.alloc(10) 创建一个指定长度为10的buffer数据,改方法在创建内存空间的时候,同时将数据清空。
Buffer.allocUnsafe(10) 创建一个指定长度为10的buffer数据,改方法在创建内存空间的时候,内存空间中的数据没有清空,可能含有敏感数据。
Buffer.byteLength(string[, encoding]) 返回string在内存中分配字节长度
Buffer.isBuffer(buf) 判断buf是否为Buffer对象
buf.buffer
buffer
属性指向创建该 Buffer
的底层的 ArrayBuffer
对象。
const arrayBuffer = new ArrayBuffer(16);
const buffer = Buffer.from(arrayBuffer);
console.log(buffer.buffer === arrayBuffer);
// 输出: true
buf.equals(otherBuffer) buf
与 otherBuffer
具有完全相同的字节,则返回 true
,否则返回 false
。
例子:
const buf1 = Buffer.from(‘ABC‘);
const buf2 = Buffer.from(‘414243‘, ‘hex‘);
const buf3 = Buffer.from(‘ABCD‘);
// 输出: true
console.log(buf1.equals(buf2));
// 输出: false
console.log(buf1.equals(buf3));
buf.fill(value[, offset[, end]][, encoding]) 该方法与Array.fill()类似
buf.includes(value[, byteOffset][, encoding])
value
<string> | <Buffer> | <integer> 要搜索的值byteOffset
<integer>buf
中开始搜索的位置。默认:0
encoding
<string> 如果value
是一个字符串,则这是它的字符编码。 默认:‘utf8‘
- 返回: <boolean> 如果
buf
找到value
,则返回true
,否则返回false
相当于 buf.indexOf() !== -1
。
例子:
const buf = Buffer.from(‘this is a buffer‘);
// 输出: true
console.log(buf.includes(‘this‘));
// 输出: true
console.log(buf.includes(‘is‘));
// 输出: true
console.log(buf.includes(Buffer.from(‘a buffer‘)));
// 输出: true
// (97 是 ‘a‘ 的十进制 ASCII 值)
console.log(buf.includes(97));
// 输出: false
console.log(buf.includes(Buffer.from(‘a buffer example‘)));
// 输出: true
console.log(buf.includes(Buffer.from(‘a buffer example‘).slice(0, 8)));
// 输出: false
console.log(buf.includes(‘this‘, 4));
Buffer与字符编码
Buffer
实例一般用于表示编码字符的序列,比如 UTF-8 、 UCS2 、 Base64 、或十六进制编码的数据。 通过使用显式的字符编码,就可以在 Buffer
实例与普通的 JavaScript 字符串之间进行相互转换。
例子:
const buf = Buffer.from(‘hello world‘, ‘ascii‘);
// 输出 68656c6c6f20776f726c64
console.log(buf.toString(‘hex‘));
// 输出 aGVsbG8gd29ybGQ=
console.log(buf.toString(‘base64‘));