Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
linwu-hi opened this issue Jul 30, 2023 · 0 comments
Open
Labels

Comments

@linwu-hi
Copy link
Owner

linwu-hi commented Jul 30, 2023

面试官:说说对 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的强大功能使得它在处理二进制数据时非常高效和灵活,适用于许多不同的应用场景。

参考文献

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant