可以看官方文档:http://nodejs.cn/api-v16/
Buffer的作用
Buffer就是一个定长的字节数组。在处理像 TCP 流或文件流时,必须使用到二进制数据。
因此在 Node.js 中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。
Buffffer缓冲器常用api
buffer用于处理二进制数据,在v8堆外分配物理内存,buffffer实例类似0-255之间的整数数组,显示的数据为十六进制,数组长度是固定的,无法修改。
1、创建buffer
Buffer.alloc(size[, fill [, encoding]]):
size: 新 Buffer 的所需长度。
fill:用于预填充新 Buffer 的值。默认值: 0 。
encoding: 如果 fill 是个字符串,则这是它的字符编码。默认值: 'utf8' 。一个英文字母1个字节,一个中文汉字3个字节
Buffer.allocUnsafe(size):
这种方式创建速度快,但是buffer的初始值是内存中其他地方的值,有安全问题
size: 新 Buffer 的所需长度。
console.log(Buffer.allocUnsafe(10)); //创建⼀个⻓度为10未初始化的buffer
Buffer.from(array):
array: 整数数组
console.log(Buffer.from([1,2,3])); //创建buffer,填充[1,2,3]
Buffer.from(string[, encoding]):
string: 要编码的字符串。
encoding:string 的字符编码。默认值: 'utf8' 。一个英文字母1个字节,一个中文汉字3个字节
console.log(Buffer.from('eric')); //创建buffer,填充字符串
console.log(Buffer.from('eric','base64')); //创建buffer,填充bese64编码的字符串
Buffffer类上常用的属性、方法
Buffer.byteLength: 返回字符串的字节长度
console.log(Buffer.byteLength('eric')); //返回字符串的字节长度,4
console.log(Buffer.byteLength('中文')); //6,一个汉字代表3个字节
Buffer.isBuffer(obj): 判断是否是buffffer
console.log(Buffer.isBuffer({}));
console.log(Buffer.isBuffer(Buffer.from('eric')));
Buffer.concat(list[, totalLength]): 合并buffffer
const buf = Buffer.from('hello');
const buf2 = Buffer.from('eric');
console.log(buf);
console.log(buf2);
console.log(Buffer.concat([buf,buf2]));
console.log(Buffer.concat([buf,buf2],10));
buf.write(string[, offffset[, length]][, encoding]): 将字符写入buffer,返回已经写入的字节数
string: 要写入 buf 的字符串。
offset: 从指定索引下写入。默认值: 0 。
length: 要写入的字节数。默认值: buf.length - offset 。
encoding: 字符串的字符编码。默认值: 'utf8' 。
const buf = Buffer.allocUnsafe(20);
console.log(buf);
// console.log(buf.write('buffer'));
console.log(buf.write('buffer',5,3));
console.log(buf);
buf.fill(value[, offffset[, end]][, encoding]): 填充buffer
value:用来填充 buf 的值。
offset: 开始填充 buf 的索引。默认值: 0 。
end: 结束填充 buf 的索引(不包含)。默认值: buf.length 。
encoding: 如果 value 是字符串,则指定 value 的字符编码。默认值: 'utf8' 。
console.log(buf.fill('eric',5,10));
buf.length: buffer的长度
buf.toString([encoding[, start[, end]]]): 将buffffer解码成字符串形式
encoding: 使用的字符编码。默认值: 'utf8' 。
start: 开始解码的字节索引。默认值: 0 。
end: 结束解码的字节索引(不包含)。默认值: buf.length 。
const buf = Buffer.from('test');
console.log(buf.toString('utf8',1,3));
buf.toJSON: 返回 buffffer 的 JSON 格式
const buf = Buffer.from('test');
console.log(buf.toJSON());
buf.equals(otherBuffer): 对比其它buffer是否具有完全相同的字节
otherBuffer: 要对比的buffer
const buf1 = Buffer.from('ABC');
const buf2 = Buffer.from('414243', 'hex');
const buf3 = Buffer.from('ABCD');
console.log(buf1);
console.log(buf2);
console.log(buf1.equals(buf2)); // 打印: true
console.log(buf1.equals(buf3));
buf.indexOf / lastIndexOf: 查找指定的值对应的索引
buf.slice([start[, end]]): 切割buffffer
start: 新 Buffer 开始的位置。默认值: 0 。
end: 新 Buffer 结束的位置(不包含)。默认值: buf.length 。
const buf = Buffer.from('abcdefghi');
console.log(buf.slice(2,7).toString());//cdefg
buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]]): 拷贝buffer
target:要拷贝进的 Buffer 或 Uint8Array 。
targetStart :目标 buffer 中开始写入之前要跳过的字节数。默认值: 0 。
sourceStart: 来源 buffer 中开始拷贝的索引。默认值: 0 。
sourceEnd: 来源 buffer 中结束拷贝的索引(不包含)。默认值: buf.length 。
const buf = Buffer.from('abcdefghi');
const buf2 = Buffer.from('test');
// console.log(buf.slice(2,7).toString());
// console.log(buf.copy(buf2));
// console.log(buf2.toString());
console.log(buf2.copy(buf,2,1,3));
console.log(buf.toString());