JS Buffer对象

774 阅读4分钟

Buffer

简介:

JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。 但在处理像 TCP 流或文件流时,必须使用到二进制数据。因此在 Node.js 中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。 在 Node.js 中,Buffer 类是随 Node 内核一起发布的核心库。Buffer 库为 Node.js 带来了一种存储原始数据的方法,可以让 Node.js 处理二进制数据,每当需要在 Node.js 中处理 I/O 操作中移动的数据时,就有可能使用 Buffer 库。原始数据存储在 Buffer 类的实例中。一个 Buffer 类似于一个整数数组,但它对应于 V8 堆内存之外的一块原始内存。

Buffer作用:

Buffer 实例一般表示编码字符的序列 =====>将字符串与 buffer 实例进行转换

Node.js 目前支持的字符编码包括

1. ascil       仅支持 7ASCII 数据。如果设置去掉高位的话,这种编码是非常快的。
2. base64      Base64 编码。
3. utf8        多字节编码的 Unicode 字符。许多网页和其他文档格式都使用 UTF  8 

4. utf16le     24 个字节,小字节序编码的 Unicode 字符。支持代理对(U+10000 至 U+10FFFF)。
5. ucs2        utf16le 的别名。
6. latin1      一种把 Buffer 编码成一字节编码的字符串的方式。
7. binary      latin1 的别名。
8. hex         将每个字节编码为两个十六进制字符。

创建 Buffer 类

alloc(size: number, fill?: string | Buffer | number, encoding?: BufferEncoding): Buffer; 初始化一个固定长度Buffer实例 Buffer.from() 返回一个Buffer实例

  • Buffer.alloc(size,fill,encoding) 返回一个指定大小的 Buffer 实例,如果没有设置 fill,则默认填满 0
  • Buffer.allocUnsafe(size): 返回一个指定大小的 Buffer 实例,但是它不会被初始化,所以它可能包含敏感的数据
  • Buffer.from(array): 返回一个被 array 的值初始化的新的 Buffer 实例(传入的 array 的元素只能是数字,不然就会自动被 0 覆盖)
  • Buffer.from(buffer): 复制传入的 Buffer 实例的数据,并返回一个新的 Buffer 实例
  • Buffer.from(string[, encoding]): 返回一个被 string 的值初始化的新的 Buffer 实例
  • Buffer.from(arrayBuffer[, byteOffset[, length]]): 返回一个新建的与给定的 ArrayBuffer 共享同一内存的 Buffer
   /**
    * {"type":"Buffer","data":[2,1,1,0,0,0,*  0,0,65,18]}
    * 初始化一个长度为10 的buffer数据
    */
   const buf1 = Buffer.alloc(10);
   //<Buffer 00 00 00 00 00 00 00 00 00 00>
   console.log(buf1);
  
   const buf = Buffer.from("我是大帅哥");
   
   console.log(buf);                    //<Buffer e6 88 91 e6 98 af e5 a4 a7 e5 b8 85 e5 93 a5>
   console.log(buf.toString("hex"));    //使用hex解码
   console.log(buf.toString("base64")); //使用base解码

缓冲区长度

length 返回 Buffer 对象所占据的内存长度。

   var buffer = Buffer.from('www.runoob.com');
   //  缓冲区长度
   console.log("buffer length: " + buffer.length);

写入缓冲区

buf.write(string,startIn dex,length,encoding):number

根据 encoding 的字符编码写入 string 到 buf 中的 offset 位置。 length 参数是写入的字节数。 如果 buf 没有足够的空间保存整个字符串,则只会写入 string 的一部分。 只部分解码的字符不会被写入。

返回值 返回实际写入的字节数。如果 buffer 空间不足, 则只会写入部分字符串。

  1. string 写入缓冲区的字符串
  2. offset 缓冲区开始写入的索引值
  3. length 写入的字节数
  4. encoding 使用的编码格式 默认utf8
   buf = Buffer.alloc(5);
   len = buf.write("www.runoob.com");
   //5
   console.log("写入字节数 : "+  len);

从缓冲区读数据

buf.toString(encoding,start,end):string

  1. encoding - 使用的编码。默认为 'utf8' 。
  2. start - 指定开始读取的索引位置,默认为 0
  3. end - 结束位置,默认为缓冲区的末尾。 返回值 解码缓冲区数据并使用指定的编码返回字符串。
   buf = Buffer.alloc(26);
   for (var i = 0 ; i < 26 ; i++) {
   buf[i] = i + 97;
   }

   console.log( buf.toString('ascii'));       //使用 'ascii' 编码, 输出: abcdefghijklmnopqrstuvwxyz
   console.log( buf.toString('ascii',0,5));   //使用 'ascii' 编码, 并输出: abcde
   console.log( buf.toString('utf8',0,5));    // 使用 'utf8' 编码, 并输出: abcde
   console.log( buf.toString(undefined,0,5)); // 使用默认的 'utf8' 编码, 并输出: abcde

将 Buffer 转换为 JSON 对象

   JSON.stringfy() //返回 JSON 对象。{"type":"Buffer","data":[]}

缓冲区合并

Buffer.concat(list,totalLength):Buffer

   // 只能合并字符串
   1. list - 用于合并的 Buffer 对象数组列表。
   2. totalLength - 指定合并后Buffer对象的总长度。


   var buffer1 = Buffer.from(('菜鸟教程'));
   var buffer2 = Buffer.from(('www.runoob.com'));
   var buffer3 = Buffer.concat([buffer1,buffer2]);
   console.log("buffer3 内容: " + buffer3.toString());

缓冲区比较

buf.compare(otherBuffer):number;//返回一个数字,表示 buf 在 otherBuffer 之前,之后或相同。

  1. otherBuffer 与 buf 对象比较的另外一个 Buffer 对象。 -1 之前 0相等 1之后

   //-1  0  1
   var buffer1 = Buffer.from('ABC');
   var buffer2 = Buffer.from('ABCD');
   var result = buffer1.compare(buffer2);

   if(result < 0) {
      console.log(buffer1 + " 在 " + buffer2 + "之前");
   }else if(result == 0){
      console.log(buffer1 + " 与 " + buffer2 + "相同");
   }else {
      console.log(buffer1 + " 在 " + buffer2 + "之后");
   }

拷贝缓冲区

buf.copy(targetBuffer,targetStart,sourceStart, sourceEnd):void 无返回值

   1. targetBuffer    要拷贝的 Buffer 对象。
   2. targetStart     数字, 可选, 默认: 0
   3. sourceStart     数字, 可选, 默认: 0
   4. sourceEnd       数字, 可选, 默认: buffer.length



   var buf1 = Buffer.from('abcdefghijkl');
   var buf2 = Buffer.from('RUNOOB');

   //将 buf2 插入到 buf1 指定位置上
   buf2.copy(buf1, 2);

   console.log(buf1.toString());

缓冲区裁剪

buf.slice(start,end):Buffer 返回一个新的缓冲区,它和旧缓冲区指向同一块内存,但是从索引 start 到 end 的位置剪切。

   1. start    起始索引, 可选, 默认: 0
   2. end      结束索引, 可选, 默认: buffer.length
   
   var buffer1 = Buffer.from('runoob');
   // 剪切缓冲区
   var buffer2 = buffer1.slice(0,2);
   console.log("buffer2 content: " + buffer2.toString());

更多 Buffer API nodejs.cn/api/buffer.…

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 3天,点击查看活动详情