首页前端开发JavaScriptbuffer是什么?深入了解Nodejs中的buffer模块

buffer是什么?深入了解Nodejs中的buffer模块

时间2024-01-31 03:46:02发布访客分类JavaScript浏览422
导读:收集整理的这篇文章主要介绍了buffer是什么?深入了解Nodejs中的buffer模块,觉得挺不错的,现在分享给大家,也给大家做个参考。buffer是什么?下面本篇文章带大家深入了解一下Nodejs中的buffer模块,介绍一下创建、复制...
收集整理的这篇文章主要介绍了buffer是什么?深入了解Nodejs中的buffer模块,觉得挺不错的,现在分享给大家,也给大家做个参考。buffer是什么?下面本篇文章带大家深入了解一下Nodejs中的buffer模块,介绍一下创建、复制、拼接、截取、填充Buffer,以及Buffer与String相互转换的方法,希望对大家有所帮助!

1.buffer是什么?

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

即:使得NodeJS拥有像操作字符串一样来操作处理二进制数据的能力。buffer也被称为临时性暂存区,即临时存放输入和输出二进制数据的一段内存。

在之前的一篇文章聊聊Nodejs中的核心模块:stream流模块(看看如何使用)中,我们了解到在对大文件进行读取操作时候,一般不会一次性全部读取到内存中,而是以流的形式读取一段数据块,而连续的数据块便形成了数据流的概念。而在对数据块读取和写入过程中,数据首先会存储在buffer(临时性暂存区)的内存中,以待被处理。

1.1 了解buffer内存分配

Buffer对象的内存分配并不是在V8的堆内存中,而是在Node的C++层面实现内存的申请;为了高效的使用申请来得内存,Node中采用slab分配机制(一种动态内存管理机制)。

1. 2 buffer的全局性

Node在进程启动时buffer就已经加装进入内存,并将其放入全局对象,使用时候可以无需require引入,但是官方但仍然建议通过 import 或 require 语句显式地引用它。

2. 创建Buffer

buffer实例除了可以在文件读取,http请求得到之外,还可以通过手动方式构造创建。

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

参数:

  • Size: buffer长度
  • fill: 预填充值,默认值:0
  • encoding: 如果fill是字符串,则就是字符串的编码,默认:utf-8
import {
 Buffer }
     From 'buffer';
    const buf = Buffer.alloc(8);
    console.LOG(buf);
    // Buffer 00 00 00 00 00 00 00 00>
    

2.2 Buffer.allocUnsafe(size)

参数:

  • size: 新的buffer所需要长度
  • 以这种方式创建的 Buffer 实例的底层内存不会被初始化。 新创建的 Buffer 的内容是未知的,可能包含敏感的数据。
import {
 Buffer }
     from 'buffer';
    const buf = Buffer.allocUnsafe(8);
    console.log(buf);
    // Buffer e8 bf 99 e6 98 af e4 b8 80 e6>
    

2.3 Buffer.from(string[, encoding])

创建包含传入string的新buffer

参数:

  • string: 字符串
  • 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 72>
    

2.4 Buffer.from(array)

使用 0255 范围内的字节 array 分配新的 Buffer

import {
 Buffer }
     from 'buffer';
    const array = [0x62, 0x78, 0x84];
    const buf = Buffer.from(array);
    console.log(buf);
    // Buffer 62 78 84>
    

3. 复制Buffer

3.1 Buffer.from(buffer)

参数:

  • buffer,要复制的buffer实例
import {
 Buffer }
     from 'buffer';
    // 新建const buF1 = Buffer.alloc(10, 2);
    // 复制const buf2 = Buffer.from(buf1);
    console.log(buf1);
    // Buffer 02 02 02 02 02 02 02 02 02 02>
    console.log(buf2);
    // Buffer 02 02 02 02 02 02 02 02 02 02>
    

3.2 buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])

将buf实例复制到target目标

import {
 Buffer }
     from 'buffer';
    const buf1 = Buffer.alloc(10, 2);
    const buf2 = Buffer.allocUnsafe(10)// 将buf1复制到buf2buf1.copy(buf2);
    console.log(buf1);
    // Buffer 02 02 02 02 02 02 02 02 02 02>
    console.log(buf2);
    // Buffer 02 02 02 02 02 02 02 02 02 02>
    

4. 拼接Buffer

4.1 Buffer.concat(list[, totalLength])

返回list中所有buffer实例连接在一起的新buffer

参数:

  • list:Buffer[]> | UnIT8Array[]>
  • totalLength: 连接总长度。

注意

  • 如果列表没有条目,或者 totalLength 为 0,则返回新的零长度 Buffer。
  • 如果未提供 totalLength,则从 list 中的 Buffer 实例通过相加其长度来计算。
import {
 Buffer }
     from 'buffer';
    const buf1 = Buffer.alloc(4, 2);
    const buf2 = Buffer.alloc(4, 3);
    const buf3 = Buffer.concat([buf1, buf2]);
    console.log(buf1);
     // Buffer 02 02 02 02>
    console.log(buf2);
     // Buffer 03 03 03 03>
    console.log(buf3);
     // Buffer 02 02 02 02 03 03 03 03>
    

5. 截取Buffer

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

从buf实例中返回新的Buffer实例,返回的新Buffer实例只是源buf实例的引用,即对新返回的实例修改会影响原有的Buffer实例

参数:

  • start: 起始位置,默认0
  • end: 结束位置,默认buf.length
import {
 Buffer }
     from 'buffer';
    const buf1 = Buffer.alloc(10, 2);
    // 截取const buf2 = buf1.slice(1,4);
    // 截取部分修改buf2[0] = 0x63;
    console.log(buf1);
    // Buffer 02 63 02 02 02 02 02 02 02 02>
    console.log(buf2);
    // Buffer 63 02 02>
    

6. 填充Buffer

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

参数:

  • value,填充值
  • offset: 在开始填充 buf 之前要跳过的字节数,默认值0
  • end: 结束填充buf(不包括在内)的位置,默认值buf.length
  • encoding,如果value值为字符串,则为字符串编码,默认utf-8
import {
 Buffer }
     from 'buffer';
    const buf1 = Buffer.allocUnsafe(8).fill(2);
    console.log(buf1);
    // Buffer 02 02 02 02 02 02 02 02>
    

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

根据 encoding 中的字符编码将 string 写入 buf 的 offset 处。

注意:length 参数是要写入的字节数。 如果 buf 没有足够的空间来容纳整个字符串,则只会写入 string 的一部分

参数:

  • string: 写入的字符串值
  • offset: 开始写入 string 之前要跳过的字节数,默认值为0
  • length: 写入的最大字节数,默认值buf.length - offset
  • encoding: 编码,默认utf-8
import {
 Buffer }
     from 'buffer';
    // buf1 length为12const buf1 = Buffer.alloc(12, 3);
    // write offset大于buf1.length,写入无效buf1.write('hello', 12);
    console.log(buf1);
    // Buffer 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

import {
 Buffer }
     from 'buffer';
    const buf1 = Buffer.alloc(12, 3);
    console.log(Buffer.isBuffer(buf1));
    // true

7.2 Buffer.isEncoding(encoding)

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

import {
 Buffer }
     from 'buffer';
    console.log(Buffer.isEncoding('utf-8'))// true

8. Buffer与String的转换

Buffer转String

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

参数:

  • encoding:使用的字符串编码,默认utf-8
  • start,开始位置,默认0
  • end,结束位置,默认buf.length
import {
 Buffer }
     from 'buffer';
    const buf1 = Buffer.allocUnsafe(26)for (let i = 0;
     i  26;
 i++) {
      // 97 是 'a' 的十进制 ASCII 值。  buf1[i] = i + 97;
}
    console.log(buf1.toString())// abcdefghijklmnopqrstuvwxyz

String转Buffer

8.2 Buffer.from(string[, encoding])

参数:

  • string: 字符串
  • 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 72>
    

9. Buffer与Array的对比

9.1 与Array类似点

  • 可以使用下标获取指定位置的值
  • 可以使用length属性获取Buffer大小
  • 可以使用for...of遍历

9.2 与Array不同之处

  • 存储的是16进制的两位数
  • 值为0-255
  • 支持多种编码格式
  • 内存不在v8堆中分配
  • 底层有c++实现,上层由js控制

更多node相关知识,请访问:nodejs 教程!!

以上就是buffer是什么?深入了解Nodejs中的buffer模块的详细内容,更多请关注其它相关文章!

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!

Nodejs

若转载请注明出处: buffer是什么?深入了解Nodejs中的buffer模块
本文地址: https://pptw.com/jishu/593438.html
手把手教你安装和配置pm2,实现自动化部署node项目 Perl和C++的区别是什么?Perl和C++的简单比较

游客 回复需填写必要信息