nodeJS入门-Buffer对象

Buffer是什么

Buffer代表一个缓冲区,主要用于操作二进制数据流,其用法与数组非常相似。

创建一个Buffer实例

使用new操作符,有四种方法创建一个Buffer实例:

  • new Buffer(size),创建一个指定大小的buffer
  • new Buffer(array),根据一个字节数组来创建一个buffer
  • new Buffer(str[,encoding]),根据一个字符串和编码格式创建buffer,不指定编码时默认使用utf8
  • new Buffer(buffer),根据buffer实例创建一个新的buffer

 一、使用new Buffer(size)方式创建一个Buffer实例:

var buf=new Buffer(10);
console.log(buf);

运行结果如下:

注意:

1、使用new Buffer(size)分配的缓冲区,是未初始化的。在那块内存空间里面什么都没有

二、使用new Buffer(array)方式创建一个Buffer实例:

var bf=new Buffer([1,2,3]);
console.log(bf);

运行结果如下:

三、使用new Buffer(str[,encoding])方式创建一个Buffer实例:

var bf1=new Buffer('miao','utf-8');
console.log(bf1);
for(var i=0;i<bf1.length;i++){
    console.log(String.fromCharCode(bf1[i]));
}

运行结果如下:

注意:一个Buffer对象的大小,在创建时就固定下来,创建之后不可改变,这个结论我们可以通过下面一个实例来说明:

var buf=new Buffer(5);
buf[6]=5;
console.log(buf)

分析以下运行结果,我们发现buffer对象的长度并没有改变

 Buffer对象的方法

  • buf.write()方法

buf.write(string[, offset][, length][, encoding]) //往Buffer对象中写入数据

uf.write用来向缓冲区中写入一个字符串,返回实际写入的字节数。参数含义如下:

  • string,待写入的字符串对象
  • offset,缓冲区偏移量,指定的话就从这个位置开始写入,不指定就默认为0
  • length,要写入的字节数
  • encoding,代谢如字符串的编码格式,默认为utf8

实例:

var str='xiaoxu';
var bf=new Buffer(6);
bf.write(str); //从字母i开始写入,一直到最后
console.log(bf);
bf.write(str,1,5); //从字母i开始写入,一直写到第五位x
console.log(bf); 

运行结果:

  •  buf.toString()方法

buf.toString([encoding], [start], [end]) // 根据 encoding参数(默认是 'utf8')返回一个解码的 string 类型

实例:

var bf=new Buffer("xiaoxu");
console.log(bf);
console.log(bf.toString());

var bf2=new Buffer("小徐");
console.log(bf2);
console.log(bf2.toString('utf-8',3));

 如果不知道开始位置,则将字符全部返回,如果指定了开始位置和结束位置则按指定的返回,在上面实例中,因为一个中文占3个字节,所以在bf2这个实例中,我们指定从第三个位置开始,则返回的是徐这个汉字

运行结果:

  • buf.toJSON()

buf.toJSON()  //返回一个 JSON表示的Buffer实例。JSON.stringify将会默认调用来字符串序列化这个Buffer实例

实例:

var bf=new Buffer("xiaoxu");
console.log(bf.toJSON());

运行结果:

  • buf.slice()方法

buf.slice([start], [end]) ://返回一个新的buffer,这个buffer将会和老的buffer引用相同的内存地址,注意:修改这个新的buffer实例slice切片,也会改变原来的buffer

实例:

var bf=new Buffer("xiaoxu");
console.log(bf);
var bf2=bf.slice(2,4);
console.log(bf2);

运行结果如下:

注意:在上述实例中,bf2跟bf引用的是同一块内存,所以当bf2中的内容改变的时候,bf中的内容也会受到改变,如下实例:

var bf=new Buffer("xiaoxu");
console.log(bf);
var bf2=bf.slice(2,4);
console.log(bf2)
bf2[0]=2;
console.log(bf2);
console.log(bf);

运行结果如下:

在以上实例中,由于bf跟bf2引用的是同一块内存地址,所以当我们把bf2的第0位即61改成02的时候,bf中的61也变成了02

  • buf.copy()方法  

buf.copy(targetBuffer, [targetStart], [sourceStart], [sourceEnd]) //进行buffer的拷贝

 实例:

var bf=new Buffer('xiaoxu');
var bf4=new Buffer(10);
bf.copy(bf4);
console.log(bf4);
bf4[5]=2;
console.log(bf4);
console.log(bf);

运行结果:

在上述实例中,我们可以发现,将bf对象中的内容拷贝到bf4对象中,然后我们改变bf4对象中的内容的时候,原来的bf对象并没有受到影响

原文地址:https://www.cnblogs.com/xuxiaozhi/p/7844673.html