📜  Node.js-缓冲区

📅  最后修改于: 2020-11-03 10:08:03             🧑  作者: Mango


纯JavaScript是Unicode友好的,但是对于二进制数据却不是。在处理TCP流或文件系统时,必须处理八位位组流。 Node提供Buffer类,该类提供实例来存储类似于整数数组的原始数据,但对应于V8堆外部的原始内存分配。

缓冲区类是一个全局类,可以在应用程序中访问而无需导入缓冲区模块。

创建缓冲区

节点缓冲区可以通过多种方式构造。

方法1

以下是创建10个八位字节的未初始化缓冲区的语法-

var buf = new Buffer(10);

方法2

以下是从给定数组创建Buffer的语法-

var buf = new Buffer([10, 20, 30, 40, 50]);

方法3

以下是从给定字符串和可选编码类型创建Buffer的语法-

var buf = new Buffer("Simply Easy Learning", "utf-8");

尽管“ utf8”是默认编码,但是您可以使用以下任何一种编码:“ ascii”,“ utf8”,“ utf16le”,“ ucs2”,“ base64”或“ hex”。

写入缓冲区

句法

以下是写入节点缓冲区的方法的语法-

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

参量

这是使用的参数的描述-

  • 字符串这是要写入缓冲区的字符串数据。

  • offset-这是开始写入缓冲区的索引。预设值为0。

  • 长度-这是要写入的字节数。默认为buffer.length。

  • 编码-要使用的编码。 ‘utf8’是默认编码。

返回值

此方法返回写入的八位位组数。如果缓冲区中没有足够的空间来容纳整个字符串,它将写入字符串的一部分。

buf = new Buffer(256);
len = buf.write("Simply Easy Learning");

console.log("Octets written : "+  len);

执行以上程序后,将产生以下结果-

Octets written : 20

从缓冲区读取

句法

以下是从节点缓冲区读取数据的方法的语法-

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

参量

这是使用的参数的描述-

  • 编码-要使用的编码。 ‘utf8’是默认编码。

  • 开始-开始指数开始读取,默认为0。

  • end-结束索引以结束读取,默认为完整缓冲区。

返回值

此方法从使用指定字符集编码编码的缓冲区数据中解码并返回字符串。

buf = new Buffer(26);
for (var i = 0 ; i < 26 ; i++) {
  buf[i] = i + 97;
}

console.log( buf.toString('ascii'));       // outputs: abcdefghijklmnopqrstuvwxyz
console.log( buf.toString('ascii',0,5));   // outputs: abcde
console.log( buf.toString('utf8',0,5));    // outputs: abcde
console.log( buf.toString(undefined,0,5)); // encoding defaults to 'utf8', outputs abcde

执行以上程序后,将产生以下结果-

abcdefghijklmnopqrstuvwxyz
abcde
abcde
abcde

将缓冲区转换为JSON

句法

以下是将节点缓冲区转换为JSON对象的方法的语法-

buf.toJSON()

返回值

此方法返回Buffer实例的JSON表示形式。

var buf = new Buffer('Simply Easy Learning');
var json = buf.toJSON(buf);

console.log(json);

执行以上程序后,将产生以下结果-

{ type: 'Buffer',
   data: 
   [ 
      83,
      105,
      109,
      112,
      108,
      121,
      32,
      69,
      97,
      115,
      121,
      32,
      76,
      101,
      97,
      114,
      110,
      105,
      110,
      103 
   ]
}

串联缓冲区

句法

以下是将节点缓冲区连接到单个节点缓冲区的方法的语法-

Buffer.concat(list[, totalLength])

参量

这是使用的参数的描述-

  • 名单-缓冲区的数组列表对象要连接。

  • totalLength-这是连接时缓冲区的总长度。

返回值

此方法返回一个Buffer实例。

var buffer1 = new Buffer('TutorialsPoint ');
var buffer2 = new Buffer('Simply Easy Learning');
var buffer3 = Buffer.concat([buffer1,buffer2]);

console.log("buffer3 content: " + buffer3.toString());

执行以上程序后,将产生以下结果-

buffer3 content: TutorialsPoint Simply Easy Learning

比较缓冲区

句法

以下是比较两个节点缓冲区的方法的语法-

buf.compare(otherBuffer);

参量

这是使用的参数的描述-

  • otherBuffer-这是将与buf比较的另一个缓冲区

返回值

返回一个数字,该数字指示它按排序顺序在otherBuffer之前还是之后。

var buffer1 = new Buffer('ABC');
var buffer2 = new Buffer('ABCD');
var result = buffer1.compare(buffer2);

if(result < 0) {
   console.log(buffer1 +" comes before " + buffer2);
} else if(result === 0) {
   console.log(buffer1 +" is same as " + buffer2);
} else {
   console.log(buffer1 +" comes after " + buffer2);
}

执行以上程序后,将产生以下结果-

ABC comes before ABCD

复制缓冲区

句法

以下是复制节点缓冲区的方法的语法-

buf.copy(targetBuffer[, targetStart][, sourceStart][, sourceEnd])

参量

这是使用的参数的描述-

  • targetBuffer-将在其中复制缓冲区的Buffer对象。

  • targetStart-数字,可选,默认值:0

  • sourceStart-数字,可选,默认值:0

  • sourceEnd-数字,可选,默认值:buffer.length

返回值

没有返回值。即使目标存储区与源重叠,也将数据从此缓冲区的区域复制到目标缓冲区中的区域。如果未定义,则targetStart和sourceStart参数默认为0,而sourceEnd默认为buffer.length。

var buffer1 = new Buffer('ABC');

//copy a buffer
var buffer2 = new Buffer(3);
buffer1.copy(buffer2);
console.log("buffer2 content: " + buffer2.toString());

执行以上程序后,将产生以下结果-

buffer2 content: ABC

切片缓冲区

句法

以下是获取节点缓冲区的子缓冲区的方法的语法-

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

参量

这是使用的参数的描述-

  • 开始-数字,可选,默认:0

  • 结束– number,可选,默认:buffer.length

返回值

返回一个新缓冲区,该缓冲区引用与旧缓冲区相同的内存,但偏移量并由开始(默认为0)和结束(默认为buffer.length)索引进行裁剪。负索引从缓冲区的末尾开始。

var buffer1 = new Buffer('TutorialsPoint');

//slicing a buffer
var buffer2 = buffer1.slice(0,9);
console.log("buffer2 content: " + buffer2.toString());

执行以上程序后,将产生以下结果-

buffer2 content: Tutorials

缓冲长度

句法

以下是获取以字节为单位的节点缓冲区大小的方法的语法-

buf.length;

返回值

返回缓冲区的大小(以字节为单位)。

var buffer = new Buffer('TutorialsPoint');

//length of the buffer
console.log("buffer length: " + buffer.length);

执行上述程序时,将产生以下结果-

buffer length: 14

方法参考

类方法

Sr.No. Method & Description
1

Buffer.isEncoding(encoding)

Returns true if the encoding is a valid encoding argument, false otherwise.

2

Buffer.isBuffer(obj)

Tests if obj is a Buffer.

3

Buffer.byteLength(string[, encoding])

Gives the actual byte length of a string. encoding defaults to ‘utf8’. It is not the same as String.prototype.length, since String.prototype.length returns the number of characters in a string.

4

Buffer.concat(list[, totalLength])

Returns a buffer which is the result of concatenating all the buffers in the list together.

5

Buffer.compare(buf1, buf2)

The same as buf1.compare(buf2). Useful for sorting an array of buffers.