node-buffer

Node.js – Buffer

在浏览器中,JavaScript直接处理字符串即可满足绝大多数的业务需求,而Node并不同于浏览器的应用场景,它需要处理网络流和文件I/O流,操作字符串远远不能满足传输的性能需求,于是Buffer对象应用而生。

Buffer结构

Buffer是一个像Array的对象,但它主要用于操作字节。Buffer是一个典型的JavaScript与C++结合的模块,它将性能相关部分由C++实现,将非性能部分由JavaScript实现。

Buffer类是一个全局变量,用于直接处理二进制数据。Buffer对象类似于数组,它的元素为16进制的两位数。

1
2
3
4
5
const buffer =  Buffer.from('Welcome to 中国', 'utf-8');
console.log(buffer);
// out => <Buffer 48 65 6c 6c 6f 20 57 6f 6c 72 64>

console.log(buffer.length); // out => 17

给元素的赋值小于0时,就将该值逐次加256,直到得到一个0-255的整数。如果得到的数大于255,就逐次减去256,直到得到一个0-255的整数。如果是小数,舍弃小数部分,只保留整数部分。

1
2
3
4
5
6
7
8
let buf = Buffer.alloc(5);
console.log(buf); // <Buffer 00 00 00 00 00>

buf[0] = 10;
console.log(buf[0]); // out => 10

buf[0] = -100;
console.log(buf[0]); // out => 156

Bufer内存分配

Buffer对象的内存分配不是在V8的堆内存中,而是在Node的C++层面实现内存的申请的,在JavaScript中分配内存。

Node采用了slab动态内存管理机制,slab就是一块申请好的固定大小的内存区域。具有 full(完全分配)、partial(部分分配)、empty(没有被分配)3种状态。