linwu-hi / code-interview

前端面试小册,包含Vue面试题,React面试题,JS面试题,HTTP面试题,工程化面试题,CSS面试题,算法面试题,大厂面试题,高频面试题
187 stars 22 forks source link

面试官:说说对 Node 中的 Buffer 的理解?应用场景? #156

Open linwu-hi opened 1 year ago

linwu-hi commented 1 year ago

面试官:说说对 Node 中的 Buffer 的理解?应用场景?

一、什么是Buffer?

在Node.js应用中,我们常常需要处理网络协议、操作数据库、处理图片或接收上传文件等任务。在这些任务中,需要处理大量的二进制数据,而Node.js提供了一个专门用于处理二进制数据的类——Buffer

Buffer是一种在内存中分配的用于存储二进制数据的缓冲区,它类似于整数数组,但专门用于存储字节。Buffer的大小在创建时确定,并且不能更改。它是Node.js中处理二进制数据的核心工具之一。

二、使用Buffer

Node.js提供了多种创建Buffer的方式,常用的有Buffer.from()Buffer.alloc()

Buffer.from()

const b1 = Buffer.from('hello');
const b2 = Buffer.from('hello', 'utf8');
const b3 = Buffer.from([104, 101, 108, 108, 111]);
const b4 = Buffer.from(b3);

console.log(b1, b2, b3, b4); // <Buffer 68 65 6c 6c 6f> <Buffer 68 65 6c 6c 6f> <Buffer 68 65 6c 6c 6f> <Buffer 68 65 6c 6c 6f>

Buffer.alloc()

const bAlloc1 = Buffer.alloc(10); // 创建一个大小为 10 个字节的缓冲区,会清空之前分配的内存
const bAlloc2 = Buffer.alloc(10, 1); // 创建一个长度为 10 的Buffer,其中全部填充了值为 `1` 的字节
console.log(bAlloc1); // <Buffer 00 00 00 00 00 00 00 00 00 00>
console.log(bAlloc2); // <Buffer 01 01 01 01 01 01 01 01 01 01>

通过Buffer,我们可以将二进制数据转换成不同编码的字符串,例如:

const buffer = Buffer.from('hello');
console.log(buffer); // <Buffer 68 65 6c 6c 6f>
const str = buffer.toString();
console.log(str); // hello

三、应用场景

Buffer在Node.js中有广泛的应用场景,特别是与流的概念相关的操作。

I/O操作

通过流的形式,可以将一个文件的内容读取到另外一个文件。

const fs = require('fs');

const inputStream = fs.createReadStream('input.txt'); // 创建可读流
const outputStream = fs.createWriteStream('output.txt'); // 创建可写流

inputStream.pipe(outputStream); // 管道读写

加解密

在一些加解密算法中,我们会使用Buffer,例如crypto.createCipheriv的第二个参数key可以为stringBuffer类型。

zlib.js

zlib.js是Node.js的核心库之一,它利用了Buffer的功能来操作二进制数据流,提供了压缩或解压功能。

Buffer的强大功能使得它在处理二进制数据时非常高效和灵活,适用于许多不同的应用场景。

参考文献