一、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等。