深入浅出 Node.js_Buffer

2018-10-28  本文已影响20人  独木舟的木

在网络流和文件的操作中,需要处理大量的二进制数据,JavaScript自有的字符串无法满足需求(ECAMScript 2015 引入了 TypedArray),Buffer 对象应运而生。

Node.js Buffer API

Buffer 结构

Buffer 是一个像 Array 的对象,但它主要用于操作字节。
Buffer 的运用场景:文件I/O网络I/O
Buffer 是二进制数据,字符串与Buffer之间存在编码关系。

模块结构

Buffer中,性能相关部分,使用C++实现;非性能相关部分,使用JavaScript实现。

image

Buffer 对象

Buffer 对象类似于数组,它的元素为 16 进制的两位数,即0到255的数值。

var str = '深入浅出 node.js';
var buf = Buffer.from(str, 'utf-8');
console.log(buf); // <Buffer e6 b7 b1 e5 85 a5 e6 b5 85 e5 87 ba 20 6e 6f 64 65 2e 6a 73>

var buf2 = Buffer.alloc(100);
// 通过 length 获取长度
console.log(buf2.length); // 100
// 通过下标访问元素、赋值
console.log(buf2[10]); // 0

给元素的赋值(0~255)规则:

Buffer 内存分配

简单而言,真正的内存是在Node的C++层面提供的,JavaScript层面只是使用它。

Buffer 的转换

Buffer 对象可以与字符串之间相互转换。

支持的字符串编码类型有:ASCII、UTF-8、UTF-16LE/UCS-2、Base64、Latin1、Binary、Hex。

判断编码是否支持转换:

Buffer.isEncoding(ecoding); // true/false

第三方模块:

宽字节中文乱码

// Buffer 的拼接
var chunks = []; // 用数组来存储接收到的所有Buffer片段
var size = 0;    // 记录下所有片段的总长度
res.on('data', function(chunk) {
    chunks.push(chunk);
    size += chunk.length;
});
res.on('end', function() {
    // Buffer.concat() 生成一个合并的 Buffer 对象
    var buf = Buffer.concat(chunks, size);
    vr str = iconv.decode(buf, 'utf8');
    console.log(str);
});

Buffer 与性能

上一篇下一篇

猜你喜欢

热点阅读