Node.js - 缓冲区


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

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

创建缓冲区

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

方法一

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

var buf = new Buffer(10);

方法2

以下是从给定数组创建缓冲区的语法 -

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

方法三

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

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

虽然“utf8”是默认编码,但您可以使用以下任何编码“ascii”、“utf8”、“utf16le”、“ucs2”、“base64”或“hex”。

写入缓冲区

句法

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

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

参数

这是所使用参数的描述 -

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

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

  • length - 这是要写入的字节数。默认为 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”是默认编码。

  • start - 开始读取的开始索引,默认为 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

句法

以下是将 Node Buffer 转换为 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])

参数

这是所使用参数的描述 -

  • list - 要连接的 Buffer 对象的数组列表。

  • 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 之前还是之后,或者与 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 - 将复制缓冲区的缓冲区对象。

  • 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

  • end - 数字,可选,默认: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

方法参考

类方法

先生。 方法及说明
1

Buffer.isEncoding(编码)

如果编码是有效的编码参数,则返回 true,否则返回 false。

2

Buffer.isBuffer(obj)

测试 obj 是否是缓冲区。

3

Buffer.byteLength(字符串[,编码])

给出字符串的实际字节长度。编码默认为“utf8”。它与 String.prototype.length 不同,因为 String.prototype.length 返回字符串中的字符数。

4

Buffer.concat(列表[, 总长度])

返回一个缓冲区,它是将列表中的所有缓冲区连接在一起的结果。

5

Buffer.compare(buf1, buf2)

与 buf1.compare(buf2) 相同。对于对缓冲区数组进行排序很有用。