Buffer
对象是Node
用于在网络或文件系统操作等场景中处理二进制数据流。用于表示固定长度的字节
序列。
一个 Buffer类似于一个整数数组,它对应了 V8 堆之外的一块原始内存。
Buffer
在Node
是一个全局变量,无需通过require
关键字来导入其模块。
在V6.0前创建
Buffer
对象直接使用new
关键字来创建实例,但其对内存的权限操作比较大,可直接捕获一些敏感信息,所以在V6.0之后,官方建议使用Buffer.from()
接口去创建其对象
Buffer
的结构与数组类型,操作方法也与数组类型Buffer
专门用于存储二进制数据,数组不能存储二进制数据、Buffer
存储的是二进制数据,以16进制的形式显示Buffer
中每个元素占用一个字节,即每个元素的范围是00~ff
(0~255)Buffer
是对底层内存的直接操作,长度确定了就不能再修改Buffer
实例一般用于表示编码字符的序列。通过显式的字符编码,可以在 Buffer 实例与普通的字符串之间进行相互转化。
Node.js目前支持的字符编码:
const buf = Buffer.from('Node.js', 'ascii');
console.log(buf.toString('hex')); // 4e6f64652e6a73
console.log(buf.toString('base64')); // Tm9kZS5qcw==
Buffer
提供了多种方式来创建其实例。
参数说明:
// 创建一个长度为 10, 且用 0 填充的 Buffer 实例
const buf1 = Buffer.alloc(10)
console.log(buf1) //
// 创建一个长度为 10, 且用 6 填充的 Buffer 实例
const buf2 = Buffer.alloc(10, 6)
console.log(buf2) //
const buf3 = Buffer.alloc(10, "x")
console.log(buf3) //
const buf4 = Buffer.alloc(10, "nodejs", "base64")
console.log(buf4) //
注意:
返回一个指定大小的实例。其不会被初始化,可能包含敏感信息
。
参数说明:
const buf1 = Buffer.allocUnsafe(10)
// 此处输入不确定,可能包含敏感信息
console.log(buf1) //
// 通过 实例的 fill() 填充数据
buf1.fill(1)
console.log(buf1) //
通过一个字节的 array 创建一个新的 Buffer
参数说明:
const buf1 = Buffer.from([11, 22, 33, 44])
console.log(buf1) //
将传入的 buffer 数据拷贝到一个新建的 Buffer 实例
参数说明:
const buf1 = Buffer.from([11, 22, 33, 44])
const buf2 = Buffer.from(buf1)
console.log(buf2) //
创建一个包含 string 的 Buffer 实例,encoding 表示 string 的字符编码
参数说明:
const buf1 = Buffer.from("中国")
console.log(buf1) //
const buf2 = Buffer.from("中国", "utf8")
console.log(buf2) //
const buf3 = Buffer.from("中国", "latin1")
console.log(buf3) //
创建一个与 arrayBuffer 的视图,而不会复制底层内存,共享同一块内存。
参数说明:
const arr = new Uint8Array(2)
arr[0] = 10
arr[1] = 20
const buf1 = Buffer.from(arr.buffer)
console.log(buf1) //
arr[0] = 30
console.log(buf1) //
创建一个将对象转为 Buffer 实例
参数说明:
const buf1 = Buffer.from(new String("Hello Node"))
console.log(buf1) //
返回一个合并了 list 中所有 Buffer实例的新建 Buffer
参数说明:
const buf1 = Buffer.alloc(4, 1)
const buf2 = Buffer.alloc(6, 2)
const buf3 = Buffer.alloc(8, 3)
const totalLength = buf1.length + buf2.length + buf3.length
const buf = Buffer.concat([buf1, buf2, buf3], totalLength)
console.log(buf) //
将view的底层内存复制到新的 Buffer 实例中。 新增于: v19.8.0
参数说明:
const u16 = new Uint16Array([0, 0xbbbb, 0xffff]);
const buf = Buffer.copyBytesFrom(u16)
const buf1 = Buffer.copyBytesFrom(u16, 1)
u16[1] = 0;
console.log(buf.length); // 6
console.log(buf) //
console.log(buf1.length); // 4
console.log(buf1) //
返回一个字符串的实际字节长度。(与 string.prototype.length不同,其返回的是字符串的字符数)
参数说明:
const str1 = "中国"
console.log(str1.length) // 2
console.log(Buffer.byteLength(str1, "utf8")) // 6
const str2 = "China"
console.log(str2.length) // 5
console.log(Buffer.byteLength(str2, "utf8")) // 5
返回两个buf比较的值。通常用于 Buffer实例的排序,相当于 buf1.compare(buf2)
const buf1 = Buffer.from("123")
const buf2 = Buffer.from("456");
console.log(Buffer.compare(buf1, buf2)) // -1
判断 obj 是否为 Buffer
console.log(Buffer.isBuffer(Buffer.from("abc"))) // true
console.log(Buffer.isBuffer("abc")) // false
console.log(Buffer.isBuffer([])) // false
判断encoding是支持的字符编码的名称。
console.log(Buffer.isEncoding("")) // false
console.log(Buffer.isEncoding("utf8")) // true
console.log(Buffer.isEncoding("ascii")) // true
使用指定的编码解码buf。也称为从缓冲区中读取数据
参数说明:
const buf = Buffer.from("abcdefg")
console.log(buf.toString()) // abcdefg
console.log(buf.toString("base64")) // YWJjZGVmZw==
返回buf的JSON格式。当字符串化一个Buffer实例时,**JSON.stringify()**会隐式地调用该函数。
const buf = Buffer.from("abcdefg")
/**
{
type: 'Buffer',
data: [97, 98, 99, 100, 101, 102, 103]
}
*/
console.log(buf.toJSON())
返回 buf与target的比较值(对比是基于各自的字节序列)。buf在排序上是否排在target之前、之后或相同。
参数说明:
const buf1 = Buffer.from("abc")
const buf2 = Buffer.from("ABC")
console.log(buf1.compare(buf2)) // 1
拷贝buf中数据到target中。
参数说明:
const buf1 = Buffer.from("1234567890")
console.log(buf1) //
const buf2 = Buffer.alloc(5)
buf1.copy(buf2, 1, 2)
console.log(buf2) //
若buf与otherBuffer具有完全相同的字节,则返回 true,否则返回 false。
const buf1 = Buffer.from("abc")
console.log(buf1) //
const buf2 = Buffer.from("ABC")
console.log(buf2) //
const buf3 = Buffer.from("abc", "hex")
console.log(buf3) //
console.log(buf1.equals(buf2)) // false
console.log(buf1.equals(buf3)) // false
使用value填充buf
参数说明:
const buf = Buffer.alloc(3)
buf.fill(1)
console.log(buf) //
buf.fill(2, 2)
console.log(buf) //
返回一个包含 buf 键名(索引)的迭代器
const buf = Buffer.from("1234567890")
// 0
// 1
// 2
// 3
// 4
// 5
// 6
// 7
// 8
// 9
for (const index of buf.keys()) {
console.log(index)
}
返回一个包含buf键值的迭代器
const buf = Buffer.from("1234567890")
// 49
// 50
// 51
// 52
// 53
// 54
// 55
// 56
// 57
// 48
for (const value of buf.values()) {
console.log(value)
}
从 buf的内容中,创建并返回一个**[index, byte]**迭代器。
const buf = Buffer.from("1234567890")
// [ 0, 49 ]
// [ 1, 50 ]
// [ 2, 51 ]
// [ 3, 52 ]
// [ 4, 53 ]
// [ 5, 54 ]
// [ 6, 55 ]
// [ 7, 56 ]
// [ 8, 57 ]
// [ 9, 48 ]
for (const data of buf.entries()) {
console.log(data)
}
返回buf中value首次出现的索引值
参数说明:
const buf = Buffer.from("abcdefg")
console.log(buf.indexOf("c")) // 2
console.log(buf.indexOf("c", 2)) // 2
console.log(buf.indexOf("c", 5)) // -1
返回buf中value最后一次出现的索引值
参数说明:
const buf = Buffer.from("abcdefg")
console.log(buf.lastIndexOf("c")) // 2
console.log(buf.lastIndexOf("c", 2)) // 2
console.log(buf.lastIndexOf("c", 5)) // 2
从start到end裁剪缓冲区,返回一个新的缓冲区,它和旧缓冲区指向同一块内存。
参数说明:
const buf = Buffer.from("abcdefg")
console.log(buf) //
console.log(buf.slice(2, 5)) //
根据字符编码,将字符串写入缓冲区中指定的位置
参数说明:
const buf = Buffer.alloc(100)
buf.write("Hello Node.js")
console.log(buf) //
buf.write("Hello Node.js", 0, "base64")
console.log(buf) //