您好,欢迎访问一九零五行业门户网

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. 创建bufferbuffer实例除了可以在文件读取,http请求得到之外,还可以通过手动方式构造创建。
2.1 buffer.alloc(size[, fill[, encoding]])
参数:
size: buffer长度fill: 预填充值,默认值:0encoding: 如果fill是字符串,则就是字符串的编码,默认:utf-8import { 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-8import { 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)
使用 0 – 255 范围内的字节 array 分配新的 buffer。
import { buffer } from 'buffer';const array = [0x62, 0x78, 0x84];const buf = buffer.from(array);console.log(buf);// <buffer 62 78 84>
3. 复制buffer3.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. 拼接buffer4.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. 截取buffer5.1 buf.slice([start[, end]])
从buf实例中返回新的buffer实例,返回的新buffer实例只是源buf实例的引用,即对新返回的实例修改会影响原有的buffer实例
参数:
start: 起始位置,默认0end: 结束位置,默认buf.lengthimport { 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. 填充buffer6.1 buf.fill(value[, offset[, end]][, encoding])
参数:
value,填充值offset: 在开始填充 buf 之前要跳过的字节数,默认值0end: 结束填充buf(不包括在内)的位置,默认值buf.lengthencoding,如果value值为字符串,则为字符串编码,默认utf-8import { 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 之前要跳过的字节数,默认值为0length: 写入的最大字节数,默认值buf.length - offsetencoding: 编码,默认utf-8import { 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-8start,开始位置,默认0end,结束位置,默认buf.lengthimport { 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-8import { 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模块的详细内容。
其它类似信息

推荐信息