node学习笔记——Buffer缓冲器常用api

Buffer简介

在 Node.js 中, Buffer 对象用来处理二进制数据,在v8堆外分配物理内存, Buffer 类的实例类似于从 0 到 255 之间的整数数组,显示的数据为十六进制,大小是固定的,在创建时已经确定,无法修改。Buffer 类在全局作用域中,因此无需使用 require(‘buffer’).Buffer。

创建buffer

1.Buffer.alloc(size[, fill[, encoding]])

分配一个大小为10字节的新 Buffer。 如果 fill 为 undefined,则用零填充 Buffer。

const buf1 = Buffer.alloc(10);
console.log(buf1);

输出结果:

指定了size为整数2来填充Buffer:

const buf2 = Buffer.alloc(10,2);
console.log(buf2);

输出结果:

encoding指定编码方式:

const buf3 = Buffer.alloc(10,'xutian');
const buf4 = Buffer.alloc(10,'xutian','base64');
console.log(buf3);
console.log(buf4);

输出结果:


2.Buffer.allocUnsafe(size)
创建一个大小为 size 字节的新 Buffer。以这种方式创建的 Buffer 实例的底层内存是未初始化的。 新创建的 Buffer 的内容是未知的,可能包含敏感数据。这个方法比Buffer.alloc()更快,但是返回的Buffer实例可能包含旧数据,不安全。

const buf5 = Buffer.allocUnsafe(10);
console.log(buf5);

输出结果:

因此需要使用fill() 或 write()进行重写。

3.Buffer.from(array)

const buf6 = Buffer.from([1,2,3]);
const buf7 = Buffer.from('xutian');
const buf8 = Buffer.from('xutian','base64');
console.log(buf6);
console.log(buf7);
console.log(buf8);

输出结果:


Buffer类上常用的属性和方法

1.Buffer.byteLength(string[, encoding])
用来返回字符串的字节长度。
注:一个中文字是三个字节,一个英文字母是一个字节

console.log(Buffer.byteLength('xutian'))
console.log(Buffer.byteLength('你好呀'))

输出结果:


2.Buffer.isBuffer(obj)
判断是不是Buffer。

console.log(Buffer.isBuffer({}));
console.log(Buffer.isBuffer(Buffer.from('xutian')));

输出结果:


3.Buffer.concat(list[, totalLength])

  • 返回一个合并了 list 中所有 Buffer 实例的新 Buffer。
  • 如果 list 中没有元素、或 totalLength 为 0,则返回一个长度为 0 的 Buffer。
  • 如果没有提供 totalLength,则通过将 list 中的 Buffer
    实例的长度相加来计算得出。
  • 如果提供了 totalLength,则会强制转换为无符号整数。 如果 list 中的 Buffer 合并后的总长度大于totalLength,则结果会被截断到 totalLength 的长度。
const buf = Buffer.from('hello');
const buf1 = Buffer.from('xutian');
console.log(buf);
console.log(buf1);
console.log(Buffer.concat([buf,buf1]));

输出结果:

计算合并后的数组长度:


4.buf.write(string[, offset[, length]][, encoding])
重写Buffer里的内容

const buf = Buffer.allocUnsafe(20);
console.log(buf);
//把buffer这个字符串写入
console.log(buf.write('buffer'));
console.log(buf)

输出结果:

const buf = Buffer.allocUnsafe(20);
console.log(buf);
//从第5个索引开始重写,写入的内容是字符串buffer的前三个字符
console.log(buf.write('buffer',5,3));
console.log(buf)

输出结果:


5.buf.fill(value[, offset[, end]][, encoding])
作用:填充buffer
buf.fill()和buf.write()不同的是:buf.fill()是对所有的内容进行填充;.buf.write()是对指定的内容进行填充。

const buf = Buffer.allocUnsafe(20);
console.log(buf);
console.log(buf.fill('tian'))

输出结果:

const buf = Buffer.allocUnsafe(20);
console.log(buf);
//从下标5开始填充,到下标10为止(不包括下标10)
console.log(buf.fill('tian',5,10))

输出结果:


6.buf.length
返回 buf 中的字节数。

const buf = Buffer.allocUnsafe(20);
console.log(buf.length)

输出结果:


7.buf.toString([encoding[, start[, end]]])
根据 encoding 指定的字符编码将 buf 解码成字符串。 传入 start 和 end 可以只解码 buf 的子集。

const buf = Buffer.from('test');
console.log(buf.toString());

输出结果:

可以指定截取字符串中的某一段,如下例所示,截取 test 中的下标从1到3(不包括下标3)的字符串:

const buf = Buffer.from('test');
console.log(buf.toString('utf8',1,3));

输出结果:


8.buf.toJSON()
返回 buf 的 JSON 格式。

const buf = Buffer.from('test');
console.log(buf.toJSON());

输出结果:


9.buf.equals(otherBuffer)
如果 buf 与 otherBuffer 具有完全相同的字节,则返回 true,否则返回 false。 相当于 buf.compare(otherBuffer) === 0。

const buf1 = Buffer.from('ABC');
//此处使用hex进行编码,414243解码后就是ABC
const buf2 = Buffer.from('414243', 'hex');
const buf3 = Buffer.from('ABCD');

console.log(buf1.equals(buf2));
console.log(buf1.equals(buf3));

输出结果:


10.buf.indexOf(value[, byteOffset][, encoding])
用来查找指定值对应的索引。

const buf1 = Buffer.from('ABC');
console.log(buf1.indexOf('B'));

输出结果:


11.buf.lastIndexOf(value[, byteOffset][, encoding])

与 buf.indexOf() 的区别是,返回要查找的buffer中最后一次出现 value 的索引,而不是首次出现,如果 buffer没包含 value 则返回 -1。

const buf1 = Buffer.from('ABCB');
console.log(buf1.lastIndexOf('B'));

输出结果:


12.buf.slice([start[, end]])
用来切割buffer,返回一个新的 Buffer,它引用与原始的 Buffer 相同的内存,但是由 start 和 end 索引进行偏移和裁剪。

const buf = Buffer.from('abcdefghijklmn');
//返回从下标2开始到下标7(不包括下标7)的buffer
console.log(buf.slice(2,7));

输出结果:


13.buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])
拷贝 buf 中某个区域的数据到 target 中的某个区域,即使 target 的内存区域与 buf 的重叠。

const buf = Buffer.from('abcdefghijklmn');
const buf2 = Buffer.from('test');
//打印拷贝的字节数,因为buf2有4个字节,所以只拷贝4个字节
console.log(buf.copy(buf2));
//打印拷贝后的buf2
console.log(buf2.toString());

输出结果:

targetStart :定义了从目标buffer的哪个字节开始拷贝进去

const buf = Buffer.from('abcdefghijklmn');
const buf2 = Buffer.from('test');
//从buf中下标为2的字节开始拷贝buf2中的内容
console.log(buf2.copy(buf,2));
//打印拷贝后的buf2
console.log(buf.toString());

输出结果:

sourceStart:定义了从源buffer的哪个字节开始拷贝
sourceEnd 定义了从源buffer的哪个字节开始拷贝结束

const buf = Buffer.from('abcdefghijklmn');
const buf2 = Buffer.from('test');
//从buf中下标为2的字节开始拷贝buf2中的内容,把buf2中下标为2的字符到下标为3的字符(不包括下标3)拷贝到buf中去
console.log(buf2.copy(buf,2,1,3));
//打印拷贝后的buf2
console.log(buf.toString());

输出结果:

猜你喜欢

转载自blog.csdn.net/xt_123456/article/details/106557874