更新于 

Buffer缓冲区

Buffer简介

Buffer和数组的区别
  • Buffer结构和 数组 很像,操作方法也和数组类似
  • 数组中不能存储 二进制文件 ,buffer就是专门用来存储二进制数据的
  • length属性意义不同
    • ArrayInstance.length表示数组长度
    • BufferInstance.length表示buffer占用内存的长度
Buffer的元素

为什么可以直接通过Buffer来 创建内存中的空间

  • Buffer的元素是 16进制的两位数(十六进制格式显示的二进制数)
  • Buffer元素范围在 00-ff之间
  • 实际上一个元素就表示 内存中的一个字节
  • 实际上Buffer中的内存不是通过JavaScript分配的,而是在底层 通过C++申请的

Buffer元素

打印Buffer
1
2
3
4
5
6
let str = "Hello World";
let buf = Buffer.from(str);
console.log("Buffer source data: ")
console.log(buf) // Uniform Code
console.log("Buffer content: " + buf)
console.log("Buffer length: " + buf.length);

运行结果

1
2
3
4
Buffer source data: 
<Buffer 48 65 6c 6c 6f 20 57 6f 72 6c 64>
Buffer content: Hello World
Buffer length: 11
关于length
  • ArrayInstance.length表示数组长度
  • BufferInstance.length表示buffer占用内存的长度
1
2
3
4
5
6
7
let str = "Hello 世界";
let buf = Buffer.from(str);
console.log("Buffer source data: ")
console.log(buf) // Uniform Code
console.log("Buffer content: " + buf)
console.log("Buffer length: " + buf.length);
console.log("str length: " + str.length);

运行结果

1
2
3
4
5
Buffer source data: 
<Buffer 48 65 6c 6c 6f 20 e4 b8 96 e7 95 8c>
Buffer content: Hello 世界
Buffer length: 12
str length: 8

Buffer操作

创建一个指定大小的buffer
1
2
let buf = new Buffer(10);
console.log(buf.length)

运行结果

1
2
3
10
(node:13100) [DEP0005] DeprecationWarning: Buffer() is deprecated due to security and usability issues. Please use the Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() methods instead.
(Use `node --trace-deprecation ...` to show where the warning was created)

如上所示,Buffer的构造函数都是不推荐使用的,
可以使用 Buffer.alloc() 来创建buffer对象:

1
2
3
let buf = Buffer.alloc(10);
console.log(buf.length)
console.log(buf);

运行结果

1
2
10
<Buffer 00 00 00 00 00 00 00 00 00 00>
Buffer元素写入
  • Buffer元素通过 索引操作
  • Buffer的长度一旦确定,就不能修改,因为Buffer实际上是对内存空间的直接操作
  • 写入二进制数值的位数超过8位,超出位数被忽略
  • 按索引读取buffer元素时,会默认将二进制数转化为10进制数。
1
2
3
4
5
6
7
8
9
let buf = Buffer.alloc(10);
buf[0] = 88;
buf[1] = 255;
buf[2] = 0xaa;
buf[3] = 0xabc;
buf[4] = -1;
buf[10] = 10;
console.log(buf)
console.log(buf[2]);

运行结果

1
2
<Buffer 58 ff aa bc ff 00 00 00 00 00>
170
Buffer.allocUnsafe

Buffer.allocUnsafe(size)创建一个指定大小的buffer,
buffer中可能含有敏感数据(上一次该内存空间使用留下的数据),
而Buffer.alloc会对指定的内存空间进行清空操作,
从性能上来看,allocUnsafe因为无需进行清空,因此性能更好。

Buffer.from(str)

用于将一个字符串转换为Buffer

1
2
3
let buf = Buffer.from('Hello World');
console.log(buf)
console.log(buf+'')

运行结果

1
2
<Buffer 48 65 6c 6c 6f 20 57 6f 72 6c 64>
Hello World