>  기사  >  웹 프론트엔드  >  버퍼란 무엇입니까? Nodejs의 버퍼 모듈에 대해 자세히 알아보세요.

버퍼란 무엇입니까? Nodejs의 버퍼 모듈에 대해 자세히 알아보세요.

青灯夜游
青灯夜游앞으로
2021-12-30 19:21:162985검색

버퍼란 무엇인가요? 다음 글은 Nodejs의 버퍼 모듈에 대한 심층적인 이해를 제공하고, 버퍼 생성, 복사, 접합, 가로채기, 버퍼 및 문자열 변환 방법을 소개하는 내용이 모두에게 도움이 되기를 바랍니다. !

버퍼란 무엇입니까? Nodejs의 버퍼 모듈에 대해 자세히 알아보세요.

1. 버퍼란?

JS에는 문자열, 배열, 숫자, 부울 값 등을 작동하기 위한 해당 메서드 API가 있으며 Node에서는 파일 작업, 네트워크 통신, 데이터베이스 작업, 데이터 전송 및 기타 기능도 필요하다는 것을 알고 있습니다. 레벨에서는 모두 바이너리 형태로 표현되며, HTTP 요청 및 응답에서의 데이터 전송도 바이너리 데이터로 전송되므로 현재 JS 기능만으로는 부족하므로 Node에 버퍼 모듈을 제공합니다.

즉, NodeJS에 문자열과 같은 이진 데이터를 조작할 수 있는 기능을 제공하는 것입니다. 버퍼는 입력 및 출력 바이너리 데이터를 임시로 저장하는 메모리 섹션으로 임시 저장 영역이라고도 합니다. 临时性暂存区,即临时存放输入和输出二进制数据的一段内存。

在之前的一篇文章聊聊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 &#39;buffer&#39;;

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 &#39;buffer&#39;;

const buf = Buffer.from(&#39;hello buffer&#39;);

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 &#39;buffer&#39;;

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 &#39;buffer&#39;;
// 新建
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 &#39;buffer&#39;;

const buf1 = Buffer.alloc(10, 2);
const buf2 = Buffer.allocUnsafe(10)
// 将buf1复制到buf2
buf1.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:ce1f03efdfa3a50760234dcf9b3662a8 | 2352a1ddeafcbb075c98dd9a641f874c
  • totalLength: 连接总长度。

注意

이전 기사 Nodejs의 핵심 모듈인 스트림 모듈에 대해 이야기해 보겠습니다(참조: 사용법)
    , 대용량 파일을 읽을 때 일반적으로 한꺼번에 메모리에 읽어들이는 것이 아니라, 데이터 블록을 스트림 형태로 읽어들이고, 연속적인 데이터 블록이 데이터 흐름의 개념이라는 것을 배웠습니다. 결성되었습니다. 데이터 블록을 읽고 쓰는 과정에서 데이터는 먼저 버퍼(임시 저장 영역)의 메모리에 저장되어 처리됩니다.
  • 1.1 버퍼 메모리 할당 이해

버퍼 개체의 메모리 할당은 V8의 힙 메모리에 없지만 메모리 응용 프로그램은 응용 프로그램 메모리를 효율적으로 사용하기 위해 Node의 C++ 수준에서 구현됩니다. , 노드는 슬랩 할당 메커니즘(동적 메모리 관리 메커니즘)을 채택합니다.

1.2 버퍼의 전역적 특성

노드는 프로세스가 시작될 때 이미 버퍼를 메모리에 설치하고 이를 사용할 때 전역 객체에 넣을 수 있습니다. 공식에서는 이를 가져오거나 명시적으로 참조하도록 요구합니다.

2. 버퍼 생성🎜🎜🎜파일을 읽고 http 요청을 얻는 것 외에도 버퍼 인스턴스를 수동으로 구성하고 생성할 수도 있습니다. 🎜🎜🎜🎜2.1 Buffer.alloc(size[, fill[, 인코딩]])🎜🎜🎜🎜매개변수: 🎜🎜🎜size: 버퍼 길이 🎜🎜fill: 미리 채워진 값, 기본값: 0🎜🎜encoding: if fill은 문자열이며 문자열의 인코딩입니다. 기본값: utf-8🎜🎜
import { Buffer } from &#39;buffer&#39;;

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>
🎜🎜🎜2.2 Buffer.allocUnsafe(size)🎜🎜🎜🎜매개변수: 🎜🎜🎜size: 새 버퍼의 필수 길이🎜 🎜 이를 기반으로 이렇게 생성된 Buffer 인스턴스의 기본 메모리는 초기화되지 않습니다. 새로 생성된 버퍼의 내용은 알 수 없으며 민감한 데이터를 포함할 수 있습니다. 🎜🎜
import { Buffer } from &#39;buffer&#39;;

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>
🎜🎜🎜2.3 Buffer.from(string[, 인코딩])🎜🎜🎜🎜들어오는 문자열을 포함하는 새 버퍼를 만듭니다🎜🎜매개변수: 🎜🎜🎜문자열: 문자열 🎜🎜encoding: 인코딩, 기본값: utf - 8🎜🎜
import { Buffer } from &#39;buffer&#39;;

const buf1 = Buffer.allocUnsafe(8).fill(2);

console.log(buf1);
// <Buffer 02 02 02 02 02 02 02 02>
🎜🎜🎜2.4 Buffer.from(array)🎜🎜🎜🎜0~255 array 범위의 바이트 사용 할당 새로운 버퍼. 🎜
import { Buffer } from &#39;buffer&#39;;
// buf1 length为12
const buf1 = Buffer.alloc(12, 3);
// write offset大于buf1.length,写入无效
buf1.write(&#39;hello&#39;, 12);

console.log(buf1);
// <Buffer 03 03 03 03 03 03 03 03 03 03 03 03>
// 部分写入
buf1.write(&#39;hello&#39;, 10);
// <Buffer 03 03 03 03 03 03 03 03 03 03 68 65>
🎜🎜3. Copy Buffer🎜🎜🎜🎜🎜3.1 Buffer.from(buffer)🎜🎜🎜🎜매개변수: 🎜🎜🎜buffer, 복사할 버퍼 인스턴스🎜🎜
import { Buffer } from &#39;buffer&#39;;

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

console.log(Buffer.isBuffer(buf1));
// true
🎜🎜🎜3.2 buf.copy (대상[ , targetStart[, sourceStart[, sourceEnd]]])🎜🎜🎜🎜buf 인스턴스를 대상 타겟에 복사합니다🎜
import { Buffer } from &#39;buffer&#39;;

console.log(Buffer.isEncoding(&#39;utf-8&#39;))
// true
🎜🎜4. Splice Buffer🎜🎜🎜🎜🎜4.1 Buffer.concat(list[, totalLength])🎜🎜 🎜🎜 목록의 모든 버퍼 인스턴스가 함께 연결된 새 버퍼를 반환합니다.🎜🎜매개변수: 🎜🎜🎜list:ce1f03efdfa3a50760234dcf9b3662a8 2352a1ddeafcbb075c98dd9a641f874c🎜🎜totalLength: 연결의 총 길이. 🎜🎜🎜참고: 🎜🎜🎜목록에 항목이 없거나 totalLength가 0인 경우 길이가 0인 새 버퍼가 반환됩니다. 🎜🎜totalLength가 제공되지 않으면 목록의 버퍼 인스턴스에서 길이를 추가하여 계산됩니다. 🎜🎜
import { Buffer } from &#39;buffer&#39;;

const buf1 = Buffer.allocUnsafe(26)

for (let i = 0; i < 26; i++) {
  // 97 是 &#39;a&#39; 的十进制 ASCII 值。
  buf1[i] = i + 97;
}

console.log(buf1.toString())
// abcdefghijklmnopqrstuvwxyz
🎜🎜5. Intercept Buffer🎜🎜🎜🎜🎜5.1 buf.slice([start[, end]])🎜🎜🎜🎜buf 인스턴스에서 새 Buffer 인스턴스를 반환합니다. 반환된 새 Buffer 인스턴스는 바로 소스입니다. buf 인스턴스 참조, 즉 새로 반환된 인스턴스를 수정하면 원래 버퍼 인스턴스에 영향을 미칩니다🎜🎜매개변수:🎜
  • start: 起始位置,默认0
  • end: 结束位置,默认buf.length
import { Buffer } from &#39;buffer&#39;;

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 &#39;buffer&#39;;

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 &#39;buffer&#39;;
// buf1 length为12
const buf1 = Buffer.alloc(12, 3);
// write offset大于buf1.length,写入无效
buf1.write(&#39;hello&#39;, 12);

console.log(buf1);
// <Buffer 03 03 03 03 03 03 03 03 03 03 03 03>
// 部分写入
buf1.write(&#39;hello&#39;, 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 &#39;buffer&#39;;

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

console.log(Buffer.isBuffer(buf1));
// true

7.2 Buffer.isEncoding(encoding)

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

import { Buffer } from &#39;buffer&#39;;

console.log(Buffer.isEncoding(&#39;utf-8&#39;))
// true

8. Buffer与String的转换

Buffer转String

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

参数:

  • encoding:使用的字符串编码,默认utf-8
  • start,开始位置,默认0
  • end,结束位置,默认buf.length
import { Buffer } from &#39;buffer&#39;;

const buf1 = Buffer.allocUnsafe(26)

for (let i = 0; i < 26; i++) {
  // 97 是 &#39;a&#39; 的十进制 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 &#39;buffer&#39;;

const buf = Buffer.from(&#39;hello buffer&#39;);

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 教程!!

위 내용은 버퍼란 무엇입니까? Nodejs의 버퍼 모듈에 대해 자세히 알아보세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.cn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제