Buffer缓冲区
Buffer简介
Buffer和数组的区别
- Buffer结构和 数组 很像,操作方法也和数组类似
- 数组中不能存储 二进制文件 ,buffer就是专门用来存储二进制数据的
- length属性意义不同
- ArrayInstance.length表示数组长度
- BufferInstance.length表示buffer占用内存的长度
Buffer的元素
为什么可以直接通过Buffer来 创建内存中的空间 ?
- Buffer的元素是 16进制的两位数(十六进制格式显示的二进制数)
- Buffer元素范围在 00-ff之间
- 实际上一个元素就表示 内存中的一个字节
- 实际上Buffer中的内存不是通过JavaScript分配的,而是在底层 通过C++申请的
Buffer元素
打印Buffer
1 | let str = "Hello World"; |
运行结果
1 | Buffer source data: |
关于length
- ArrayInstance.length表示数组长度
- BufferInstance.length表示buffer占用内存的长度
1 | let str = "Hello 世界"; |
运行结果
1 | Buffer source data: |
Buffer操作
创建一个指定大小的buffer
1 | let buf = new Buffer(10); |
运行结果
1 | 10 |
如上所示,Buffer的构造函数都是不推荐使用的,
可以使用 Buffer.alloc() 来创建buffer对象:
1 | let buf = Buffer.alloc(10); |
运行结果
1 | 10 |
Buffer元素写入
- Buffer元素通过 索引操作
- Buffer的长度一旦确定,就不能修改,因为Buffer实际上是对内存空间的直接操作
- 写入二进制数值的位数超过8位,超出位数被忽略
- 按索引读取buffer元素时,会默认将二进制数转化为10进制数。
1 | let buf = Buffer.alloc(10); |
运行结果
1 | <Buffer 58 ff aa bc ff 00 00 00 00 00> |
Buffer.allocUnsafe
Buffer.allocUnsafe(size)创建一个指定大小的buffer,
buffer中可能含有敏感数据(上一次该内存空间使用留下的数据),
而Buffer.alloc会对指定的内存空间进行清空操作,
从性能上来看,allocUnsafe因为无需进行清空,因此性能更好。
Buffer.from(str)
用于将一个字符串转换为Buffer
1 | let buf = Buffer.from('Hello World'); |
运行结果
1 | <Buffer 48 65 6c 6c 6f 20 57 6f 72 6c 64> |