Buffer
-
Buffer(缓冲区)介绍
JavaScript 语言没有用于读取或操作二进制数据流的机制。
Buffer
类是作为 Node.js API 的一部分引入的,用于在 TCP(面向连接的、可靠的、基于字节流的传输层通信协议) 流、文件系统操作、以及其他上下文中与八位字节流进行交互或者可以理解为处理二进制数据流;-
Buffer.alloc
创建的缓冲区是被初始化过的,所有的项都用00填充
例:
let buf1 = Buffer.alloc(6); //创建长度为6的缓冲区 console.log(buf1); // <Buffer 00 00 00 00 00 00>
-
Buffer.allocUnsafe
创建的 Buffer 并没有经过初始化,在内存中只要有闲置的 Buffer 就直接 “抓过来” 使用
例:
let buf2 = Buffer.allocUnsafe(6); //创建长度为6的缓冲区 console.log(buf2); // <Buffer 00 e7 8f a0 00 00>
Buffer.allocUnsafe 创建 Buffer 使得内存的分配非常快,但已分配的内存段可能包含潜在的敏感数据,有明显性能优势的同时又是不安全的,所以使用需格外小心
-
Buffer.from
-
支持三种传参方式
- 第一个参数为字符串,第二个参数为字符编码,如
ASCII
、UTF-8
、Base64
等等。 - 传入一个数组,数组的每一项会以十六进制存储为 Buffer 的每一项。
- 传入一个 Buffer,会将 Buffer 的每一项作为新返回 Buffer 的每一项。
- 第一个参数为字符串,第二个参数为字符编码,如
例:
// 传入字符串和字符编码 let buf = Buffer.from("hello", "utf8"); console.log(buf); // <Buffer 68 65 6c 6c 6f> //传入数组 // 数组成员为十进制数 let buf = Buffer.from([1, 2, 3]); console.log(buf); // <Buffer 01 02 03> // 数组成员为十六进制数 let buf = Buffer.from([0xe4, 0xbd, 0xa0, 0xe5, 0xa5, 0xbd]); console.log(buf); // <Buffer e4 bd a0 e5 a5 bd> console.log(buf.toString("utf8")); // 你好
在 NodeJS 中不支持
GB2312
编码,默认支持UTF-8
,在GB2312
中,一个汉字占两个字节,而在UTF-8
中,一个汉字占三个字节,所以上面 “你好” 的 Buffer 为6
个十六进制数组成。例:
// 数组成员为字符串类型的数字 let buf = Buffer.from(["1", "2", "3"]); console.log(buf); // <Buffer 01 02 03>
-
传入的数组成员可以是任何进制的数值,当成员为字符串的时候,如果值是数字会被自动识别成数值类型,如果值不是数字或成员为是其他非数值类型的数据,该成员会被初始化为
00
。创建的 Buffer 可以通过
toString
方法直接指定编码进行转换,默认编码为UTF-8
-
传入Buffer
例:
// 传入一个 Buffer let buf1 = Buffer.from("hello", "utf8"); let buf2 = Buffer.from(buf1); console.log(buf1); // <Buffer 68 65 6c 6c 6f> console.log(buf2); // <Buffer 68 65 6c 6c 6f> console.log(buf1 === buf2); // true console.log(buf1[0] === buf2[0]); // false
当传入的参数为一个 Buffer 的时候,会创建一个新的 Buffer 并复制上面的每一个成员。
Buffer 为引用类型,一个 Buffer 复制了另一个 Buffer 的成员,当其中一个 Buffer 复制的成员有更改,另一个 Buffer 对应的成员会跟着改变,因为指向同一个引用,类似于 “二维数组”。
例:
// Buffer 类比二维数组 let arr1 = [1, 2, [3]]; let arr2 = arr1.slice(); arr2[2][0] = 5; console.log(arr1); // [1, 2, [5]]
-