目的:
Buffer就是在内存中开辟一片区域(初次初始化为8KB),用来存放二进制数据
其形式可以理解成一个数组,数组中的每一项,都可以保存8位二进制:00000000,也就是一个字节
实际上是在V8堆内存之外分配了一块内存,这是因为V8的垃圾回收机制主要是针对js对象的,而二进制数据如果放在V8堆内存中,可能会导致性能问题
为什么需要
Nodejs不能控制数据传输的速度和到达时间,只能决定何时发送数据,如果还没到发送时间,则将数据放在Buffer中,即在RAM中,直至将它们发送完毕
- 如果数据到达的速度比进程消耗的速度快,那么少数早到达的数据会处于等待区等候被处理。
- 反之,如果数据到达的速度比进程消耗的速度慢,那么早先到达的数据需要等待一定量的数据到达之后才能被处理
实际场景:
- 数据形式除了简单的文本形式,还有可能是存储图片、音频、视频等非文本格式的数据
- 网络通信
- I/O操作:如fs文件读取,默认情况下就是数据先存储在buffer中
- 操作数据库
- 加解密
- zlib.js:
zlib.js为Node.js的核心库之一,其利用了缓冲区(Buffer)的功能来操作二进制数据流,提供了压缩或解压功能
Buffer方法
- Buffer.from('H'): 创建
- 参数可以是字符串
- 参数也可以是数组
- Buffer.alloc(10): 分配10个字节创建
- Buffer.write(): 写入Buffer,返回写入的字节数
- Buffer.toString('ascii'): 将二进制转为字符串,默认utf-8
- 编码与解码不是相同的格式则会出现乱码
- 设定的范围导致字符串被截断的时候,也会存在乱码
- Buffer.slice():提取一部分
- Buffer.equals() :比较两个Buffer是否相等
所支持的字符集有如下:
- ascii:仅支持 7 位 ASCII 数据,如果设置去掉高位的话,这种编码是非常快的
- utf8:多字节编码的 Unicode 字符,许多网页和其他文档格式都使用 UTF-8
- utf16le:2 或 4 个字节,小字节序编码的 Unicode 字符,支持代理对(U+10000至 U+10FFFF)
- ucs2,utf16le 的别名
- base64:Base64 编码
- latin:一种把 Buffer 编码成一字节编码的字符串的方式
- binary:latin1 的别名,
- hex:将每个字节编码为两个十六进制字符