您的位置:

Node.js Buffer:全面了解Node.js Buffer

一、Node.js Buffer简介

Node.js的Buffer是用来处理二进制数据的类,它可以直接操作底层的二进制数据,也可以将二进制数据转换成字符串格式。在Node.js中,Buffer是一个全局对象,无需使用require语句引入,即可在任何地方访问。

二、Node.js Buffer使用场景

Node.js Buffer可用于处理网络、文件、压缩、加密等数据流,包括:

1、文件流:文件操作时,读取的内容默认为Buffer格式。

2、网络流:在发送网络请求时,请求体中的数据会被转化为Buffer格式,并在接收网络响应时将收到的数据以Buffer形式返回。

3、加密:加密的输入输出均为Buffer格式。

4、字符串转二进制数据:例如将字符串转换成UTF-8编码的二进制数据。

三、创建Buffer实例

可以使用Buffer.alloc(size[, fill[, encoding]])、Buffer.allocUnsafe(size)、Buffer.from(array)、Buffer.from(string[, encoding])等方法创建Buffer实例。

1、使用Buffer.alloc(size[, fill[, encoding]])方法创建Buffer实例


const buf1 = Buffer.alloc(10); // 创建长度为10,用0x00填充的Buffer实例
const buf2 = Buffer.alloc(10, 1); // 创建长度为10,用0x01填充的Buffer实例
const buf3 = Buffer.alloc(10, 'a', 'utf8'); // 创建长度为10,用'a'填充的Buffer实例

2、使用Buffer.allocUnsafe(size)方法创建Buffer实例


const buf = Buffer.allocUnsafe(10); // 创建长度为10,只是预分配了内存空间,是未初始化的Buffer实例 
buf.fill(0); // 初始化内存为0 

3、使用Buffer.from(array)方法创建Buffer实例


const buf = Buffer.from([0x01, 0x02, 0x03]); // 创建Buffer实例,长度为3,内容为0x01, 0x02, 0x03

4、使用Buffer.from(string[, encoding])方法创建Buffer实例


const buf = Buffer.from('hello world', 'utf8'); // 创建Buffer实例,长度为11(utf8编码),内容为'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'

四、Node.js Buffer常用方法

Node.js Buffer常用方法包括:

1、buf.write(string[, offset[, length]][, encoding])

将一个字符串写入Buffer中,并返回已写入的字节数。可以指定偏移量和长度。


const buf = Buffer.alloc(10);
const bytesWritten = buf.write('hello', 1, 3, 'utf8'); // 在偏移量为1的位置写入'hel',返回已写入的字节数 3

2、buf.toString([encoding[, start[, end]]])

将Buffer对象转换为字符串。默认将Buffer对象的全部内容转换为字符串。


const buf = Buffer.from('hello world', 'utf8');
const str = b.toString('utf8'); // 转换成字符串'hello world'

3、buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])

将Buffer的内容复制到另一个Buffer中。


const buf1 = Buffer.from('hello');
const buf2 = Buffer.alloc(10);
const bytesCopied = buf1.copy(buf2, 1, 0, 3); // 将buf1的偏移量0~3的内容复制到buf2的偏移量1~4的位置,返回已复制的字节数 3

4、buf.slice([start[, end]])

创建一个新的Buffer对象,与原Buffer对象共享内存但指定偏移量和长度范围。


const buf1 = Buffer.from('hello');
const buf2 = buf1.slice(1, 3); // 创建一个新的Buffer实例,包含buf1的偏移量1~2的内容,即'el'

5、buf.toJSON()

返回一个将Buffer对象转换成JSON对象后的结果。


const buf = Buffer.from('hello');
const json = buf.toJSON(); // 转换成JSON对象
console.log(json); // { type: 'Buffer', data: [ 104, 101, 108, 108, 111 ] }

五、Node.js Buffer应用示例

1、文件读取


const fs = require('fs');
 
fs.readFile('test.txt', (err, buf) => {
    if (err) {
        console.error(err);
        return;
    }
    const str = buf.toString('utf8');
    console.log(str);
});

2、字符串加密


const crypto = require('crypto');
 
const str = 'hello world';
const hash = crypto.createHash('md5');
const buf = Buffer.from(str, 'utf8');
hash.update(buf);
console.log(hash.digest('hex'));

3、获取网络请求体的二进制数据


const http = require('http');
 
http.createServer((req, res) => {
    let chunks = [];
    req.on('data', chunk => {
        chunks.push(chunk);
    });
    req.on('end', () => {
        const buf = Buffer.concat(chunks);
        console.log(buf.toString('utf8'));
        res.end('success');
    });
}).listen(8000);

六、Node.js Buffer小结

Node.js Buffer提供了处理二进制数据的能力,可以用于处理文件流、网络流、加密等场景。Buffer的常用方法包括write、toString、copy、slice和toJSON等。