Node.js Buffer 二进制处理

JavaScript 是为浏览器设计的,能很好处理 unicode 编码的字符串,但对二机制或非 unicode 编码的数据显得无能为力。Node.js 扩展了 JavaScript 为二级制数据处理提供了 Buffer 类,可以像其他程序语言一样处理各种类型的数据。在 Node.js 中, Buffer 类用来创建一个专门存放二进制数据的缓存区,类似于一个整数数组,对应于 V8 堆内存之外的一块原始内存。

使用场景:

通过 Buffer 我们可以把图片转换成 base64 字符串,可以实现手机 APP 和服务器之间 JSON 数据的图片信息传递。还有在一些常用系统中,例如考勤机生产的 Excel 文件,我们也可以通过 Buffer 来提取内容,通过 JSON 发送到服务器保存到数据库存档。

内存限制:

Node.js 使用了本来运行在浏览器的 V8 引擎,引擎在设计之初只运行在浏览器中,默认只能使用到系统一部分内存,64位系统下位 1.4 GB,32 位系统下位 0.7 GB。Node.js 对内存的使用可以通过参数来解除。Node.js 之所以可以使用 Buffer 读取超过 V8 内存限制的大文件,原因是 Buffer 对象不同于其他对象,它不经过 V8 的内存分配机制,它使用的是系统内存。

node --max-old-space-size=2000 app.js // 单位为 MB

Buffer 创建

  • 创建长度为 10 字节的 Buffer 实例:
let buf = Buffer.alloc(10);
  • 通过给定的数组创建 Buffer 实例:
let buf = Buffer.from([10, 300, 'Hello']);
  • 通过一个字符串来创建 Buffer 实例:
let buf = Buffer.from('Hello world','utf-8');
  • 合并 Buffer 字符集
let buf_1 = Buffer.from('hello');
let buf_2 = Buffer.from('world');
let buf_3 = Buffer.concat([buf_1, buf_2]);

缓存区写入和读取

  • buf.write(string [,offset] [,length] [,encoding])
let buf = Buffer.alloc(10);
buf.write('你好');
  • buf.toString([encoding] [,start] [,end])
let buf = Buffer.alloc(10);
buf.write('你好');
// 在默认情况下字符集编码为 utf8,utf8 一个汉子占用 3 个字节。
let bufStr = buf.toString('utf-8',3,6); // '好'
  • buf.toJSON() 返回 JSON 格式的 Buffer 数据对象,包含 type 和 data。

安全构造

  • 安全构造 Buffer:缓存区的内存先被格式化,然后才使用。使用默认数字 0 填充缓存区。
Buffer.alloc(size);
Buffer.from(String, [encoding]);
  • 不安全构造 Buffer:缓存区没有格式化就直接拿来使用,容易导致运算错误
new Buffer(size);

支付多种字符集

Buffer 在保存数据和输出数据支持多种字符集

  • ASCII
  • UTF-8
  • UTF16LE
  • BASE64
  • BINARY (2进制)
  • HEX (16进制)
let s1 = Buffer.from("hello world", "HEX"); // 用 HEX 写入字符集
let s2 = Buffer.from("hello world").toString("BASE64"); // 以 BASE64 进行输出