目录

Node.js - 缓冲区( Buffers)

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

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

创建缓冲区

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

Method 1

以下是创建10个八位字节的无启动缓冲区的语法 -

var buf = new Buffer(10);

Method 2

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

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

方法3 (Method 3)

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

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

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

写入缓冲区

语法 (Syntax)

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

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

参数 (Parameters)

以下是所用参数的说明 -

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

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

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

  • encoding - 要使用的编码。 'utf8'是默认编码。

返回值 (Return Value)

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

例子 (Example)

buf = new Buffer(256);
len = buf.write("Simply Easy Learning");
console.log("Octets written : "+  len);

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

Octets written : 20

从缓冲区读书

语法 (Syntax)

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

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

参数 (Parameters)

以下是所用参数的说明 -

  • encoding - 要使用的编码。 'utf8'是默认编码。

  • start - 开始读取的开始索引,默认为0。

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

返回值 (Return Value)

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

例子 (Example)

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

将Buffer转换为JSON

语法 (Syntax)

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

buf.toJSON()

返回值 (Return Value)

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

例子 (Example)

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 
   ]
}

连接缓冲区

语法 (Syntax)

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

Buffer.concat(list[, totalLength])

参数 (Parameters)

以下是所用参数的说明 -

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

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

返回值 (Return Value)

此方法返回Buffer实例。

例子 (Example)

var buffer1 = new Buffer('IoWiki ');
var buffer2 = new Buffer('Simply Easy Learning');
var buffer3 = Buffer.concat([buffer1,buffer2]);
console.log("buffer3 content: " + buffer3.toString());

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

buffer3 content: IoWiki Simply Easy Learning

比较缓冲区

语法 (Syntax)

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

buf.compare(otherBuffer);

参数 (Parameters)

以下是所用参数的说明 -

  • otherBuffer - 这是另一个与buf进行比较的buf

返回值 (Return Value)

返回一个数字,指示它是排在顺序之前还是之后,或者与排序顺序中的otherBuffer相同。

例子 (Example)

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

复制缓冲区

语法 (Syntax)

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

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

参数 (Parameters)

以下是所用参数的说明 -

  • targetBuffer - 缓冲区将被复制的缓冲区对象。

  • targetStart - Number,Optional,默认值:0

  • sourceStart - Number,Optional,默认值:0

  • sourceEnd - Number,Optional,默认值:buffer.length

返回值 (Return Value)

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

例子 (Example)

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

切片缓冲液

语法 (Syntax)

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

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

参数 (Parameters)

以下是所用参数的说明 -

  • start - Number,Optional,默认值:0

  • end - Number,Optional,默认值:buffer.length

返回值 (Return Value)

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

例子 (Example)

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

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

buffer2 content: Tutorials

缓冲长度

语法 (Syntax)

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

buf.length;

返回值 (Return Value)

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

例子 (Example)

var buffer = new Buffer('IoWiki');
//length of the buffer
console.log("buffer length: " + buffer.length);

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

buffer length: 14

方法参考

Class Methods

Sr.No. 方法和描述
1

Buffer.isEncoding(encoding)

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

2

Buffer.isBuffer(obj)

测试obj是否为Buffer。

3

Buffer.byteLength(string[, encoding])

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

4

Buffer.concat(list[, totalLength])

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

5

Buffer.compare(buf1, buf2)

与buf1.compare(buf2)相同。 用于排序缓冲区数组。

↑回到顶部↑
WIKI教程 @2018