node buffer,javascript buffer

  node buffer,javascript buffer

  什么是缓冲?下面这篇文章带你浏览Nodejs中的buffer模块,介绍创建、复制、拼接、截取、填充Buffer的方法,以及Buffer和String的相互转换。希望对你有帮助!

  node.js速度课程简介:进入学习

  

1.buffer是什么?

  我们知道,JS有相应的方法API来处理字符串、数组、数字、布尔值等。在节点中,它还需要文件操作、网络通信、数据库操作、数据传输等能力。文件在存储层以二进制形式表示,http请求和响应中的数据传输也是二进制数据传输,所以仅靠目前的JS能力是不够的,所以在Node中提供了buffer模块。

  也就是说,NodeJS具有像字符串一样操作和处理二进制数据的能力。Buffer也叫temporary临时存储区,即暂时存储输入输出二进制数据的一段内存。

  在之前的一篇文章中,我们谈到了Nodejs的核心模块:stream流模块(见如何使用)。我们了解到,在读取一个大文件时,通常不会一次性全部读入内存,而是以流的形式读取一个数据块,连续的数据块就形成了数据流的概念。在读写数据块的过程中,数据会先存储在内存的buffer(临时暂存区)中进行处理。

  1.1 了解buffer内存分配

  buffer对象的内存分配不在V8的堆内存中,而是在节点的C层实现内存的应用。为了有效地使用请求的内存,节点采用了slab分配机制(一种动态内存管理机制)。

  1. 2 buffer的全局性

  当节点进程启动时,缓冲区已经安装到内存中,并放入全局对象中。无需引入即可使用,但官方建议通过import或require语句显式引用。

  

2. 创建Buffer

  缓冲区实例除了从文件中读取和通过http请求获取之外,还可以手动构造和创建。

  2.1 Buffer.alloc(size[, fill[, encoding]])

  参数:

  Size: buffer length fill:预填充值,默认值:0encoding:如果fill是字符串,则为该字符串的编码,默认值:utf-8 import { Buffer } from Buffer ;

  const buf=buffer . alloc(8);

  console . log(buf);

  //缓冲区00 00 00 00 00 00 00 00 002.2 Buffer.allocUnsafe(size)

  参数:

  Size:新缓冲区所需的长度。以这种方式创建的缓冲区实例的基础内存不会被初始化。新创建的缓冲区的内容未知,可能包含敏感数据。从“缓冲区”导入{ Buffer };

  const buf=buffer . allocunsafe(8);

  console . log(buf);

  //Buffer E8 BF 99 E6 98 af E4 b 8 80 E62.3 Buffer.from(string[, encoding])

  创建一个包含传入字符串的新缓冲区。

  参数:

  String: string encoding: encoding,默认值:utf-8 import { Buffer } from‘Buffer’;

  const buf=buffer . from( hello buffer );

  console . log(buf);

  //Buffer 68 65 6c 6c 6f 20 62 75 66 66 65 722.4 Buffer.from(array)

  使用0255范围内的字节数组来分配新的缓冲区。

  从“缓冲区”导入{ Buffer };

  常量数组=[0x62,0x78,0x 84];

  const buf=buffer . from(array);

  console . log(buf);

  //Buffer 62 78 84

3. 复制Buffer

  3.1 Buffer.from(buffer)

  参数:

  buffer,要复制的缓冲区实例从“Buffer”导入{ Buffer };

  //新建

  const buf1=Buffer.alloc(10,2);

  //复制

  const buf 2=buffer . from(buf 1);

  console . log(buf 1);

  //Buffer 02 02 02 02 02 02 02 02 02 02 02 02

  console . log(buf 2);

  //Buffer 02 02 02 02 02 02 02 02 02 02 023.2 buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])

  将buf实例复制到目标target

  从“缓冲区”导入{ Buffer };

  const buf1=Buffer.alloc(10,2);

  const buf 2=buffer . allocunsafe(10)

  //将缓冲器1复制到缓冲器2

  buf 1 . copy(buf 2);

  console . log(buf 1);

  //Buffer 02 02 02 02 02 02 02 02 02 02 02 02

  console . log(buf 2);

  //Buffer 02 02 02 02 02 02 02 02 02 02

4. 拼接Buffer

  4.1 Buffer.concat(list[, totalLength])

  返回一个新的缓冲区,列表中的所有缓冲区实例都连接在一起。

  参数:

  list:buffer[] unit 8 array[]total length:连接的总长度。注意:

  如果列表没有条目,或者totalLength为0,则返回一个新的零长度缓冲区。如果未提供totalLength,则通过将列表中的缓冲区实例的长度相加来计算total length。从“缓冲区”导入{ Buffer };

  const buf1=Buffer.alloc(4,2);

  const buf2=Buffer.alloc(4,3);

  const buf3=Buffer.concat([buf1,buf 2]);

  console . log(buf 1);//缓冲区02 02 02 02

  console . log(buf 2);//缓冲区03 03 03 03

  console . log(buf 3);//Buffer 02 02 02 02 03 03 03 03

5. 截取Buffer

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

  从buf实例返回一个新的缓冲区实例。返回的新缓冲区实例只是对源buf实例的引用,即修改新返回的实例会影响原来的缓冲区实例。

  参数:

  Start:起始位置,默认0end:结束位置,默认buf . length import { buffer } from buffer ;

  const buf1=Buffer.alloc(10,2);

  //截取

  const buf2=buf1.slice(1,4);

  //拦截一些修改

  buf 2[0]=0x 63;

  console . log(buf 1);

  //Buffer 02 63 02 02 02 02 02 02 02 02 02 02 02

  console . log(buf 2);

  //Buffer 63 02 02

6. 填充Buffer

  6.1 buf.fill(value[, offset[, end]][, encoding])

  参数:

  Value,padding value offset:填充buf之前要跳过的字节数,默认值0 end:buf(不包含)结束的位置,默认值buf.lengthencoding,如果value值是字符串,则是字符串编码,默认值utf-8 import { Buffer } from Buffer ;

  const buf1=Buffer.allocUnsafe(8)。填充(2);

  console . log(buf 1);

  //Buffer 02 02 02 02 02 02 02 026.2 buf.write(string[, offset[, length]][, encoding])

  根据编码中的字符编码将字符串写入buf的偏移量。

  注意:length参数是要写入的字节数。如果buf没有足够的空间来保存整个字符串,那么只有字符串的一部分会被写入。

  参数:

  String:写入的字符串值offset:写入字符串前要跳过的字节数。默认值为0length:写入的最大字节数。默认值为buf . length-offset encoding:encoding。默认值为utf-8 import { Buffer } from“Buffer”;

  //buf1长度为12

  const buf1=Buffer.alloc(12,3);

  //写入偏移量大于buf1.length,写入无效。

  buf1.write(hello ,12);

  console . log(buf 1);

  //缓冲区03 03 03 03 03 03 03 03 03 03 03 03 03 03 03

  //部分写入

  buf1.write(hello ,10);

  //Buffer 03 03 03 03 03 03 03 03 03 03 68 65

7. Buffer工具方法

  7.1 Buffer.isBuffer(obj)

  检查传入的obj是否是缓冲区。

  从“缓冲区”导入{ Buffer };

  const buf1=Buffer.alloc(12,3);

  console . log(buffer . is buffer(buf 1));

  //真7.2 Buffer.isEncoding(encoding)

  检查Buffer是否支持传入的编码名称。

  从“缓冲区”导入{ Buffer };

  console . log(buffer . isen coding( utf-8 ))

  //true

8. Buffer与String的转换

  缓冲到字符串

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

  参数:

  Encoding:使用的字符串编码,默认utf-8start,起始位置,默认0end,结束位置,默认buf . length import { buffer } from buffer ;

  const buf 1=buffer . allocunsafe(26)

  for(设I=0;i 26i ) {

  //97是‘a’的十进制ASCII值。

  buf 1[I]=I 97;

  }

  console.log(buf1.toString())

  //abcdefghijklmnopqrstuvwxyzstring到缓冲区

  8.2 Buffer.from(string[, encoding])

  参数:

  String: string encoding: encoding,默认值:utf-8 import { Buffer } from‘Buffer’;

  const buf=buffer . from( hello buffer );

  console . log(buf);

  //缓冲区68 65 6c 6c 6f 20 62 75 66 66 65 72

9. Buffer与Array的对比

  9.1 与Array类似点

  您可以使用下标获取指定位置的值,使用length属性获取缓冲区大小,并使用.穿越9.2 与Array不同之处

  以十六进制存储,两位值为0-255,支持多种编码格式。v8堆中没有分配内存。底层由C实现,上层由js控制。更多关于node的信息,请访问:nodejs教程!缓冲就是这样。了解Nodejs中缓冲模块的更多细节,更多请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: