Node.js - Buffers

Node.js - Buffers 首页 / Node.js入门教程 / Node.js - Buffers

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

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

创建缓冲区

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

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

var buf=new Buffer(10);

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

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

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

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。

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

返回值

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

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

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

执行以上程序后,将产生以下输出-

无涯教程网

Octets written : 20

从缓冲区读取

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

buf.toString([encoding][, start][, end])
  • encoding  -  要使用的编码, " 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

以下是将节点缓冲区转换为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('LearnFk ');
var buffer2=new Buffer('Simply Easy Learning');
var buffer3=Buffer.concat([buffer1,buffer2]);

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

执行以上程序后,将产生以下输出-

无涯教程网

buffer3 content: LearnFk Simply Easy Learning

比较缓冲区

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

buf.compare(otherBuffer);
  • 进行比较的缓冲区

返回值

返回一个数字,该数字指示它按排序顺序在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])
  • start    -  数字,可选,默认值:0

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

返回值

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

var buffer1=new Buffer('LearnFk');

//切片缓冲区
var buffer2=buffer1.slice(0,9);
console.log("buffer2 content: " + buffer2.toString());

执行以上程序后,将产生以下输出-

无涯教程网

buffer2 content: Learnfk

缓冲长度

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

buf.length;

返回值

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

var buffer=new Buffer('LearnFk');

//缓冲区长度
console.log("buffer length: " + buffer.length);

执行上述程序时,将产生以下输出-

buffer length: 7

缓冲类方法

Sr.No.Method & 描述
1

Buffer.isEncoding(encoding)

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

2

Buffer.isBuffer(obj)

判断obj是否为Buffer。

3

Buffer.byteLength(string [,encoding])

给出字符串的实际字节长度,编码默认为" utf8"。

4

Buffer.concat(list [,totalLength])

返回一个缓冲区,该缓冲区是将列表中的所有缓冲区连接在一起的输出。

5

Buffer.compare(buf1,buf2)

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

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

大规模数据处理实战 -〔蔡元楠〕

Flutter核心技术与实战 -〔陈航〕

Swift核心技术与实战 -〔张杰〕

NLP实战高手课 -〔王然〕

技术管理案例课 -〔许健〕

说透低代码 -〔陈旭〕

中间件核心技术与实战 -〔丁威〕

Python实战 · 从0到1搭建直播视频平台 -〔Barry〕

结构思考力 · 透过结构看表达 -〔李忠秋〕

好记忆不如烂笔头。留下您的足迹吧 :)