버퍼란 무엇인가요? 다음 글은Nodejs의 버퍼 모듈에 대한 심층적인 이해를 제공하고, 버퍼 생성, 복사, 접합, 가로채기, 버퍼 및 문자열 변환 방법을 소개하는 내용이 모두에게 도움이 되기를 바랍니다. !
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 语句显式地引用它。
buffer实例除了可以在文件读取,http请求得到之外,还可以通过手动方式构造创建。
2.1 Buffer.alloc(size[, fill[, encoding]])
参数:
import { Buffer } from 'buffer'; const buf = Buffer.alloc(8); console.log(buf); //
2.2 Buffer.allocUnsafe(size)
参数:
import { Buffer } from 'buffer'; const buf = Buffer.allocUnsafe(8); console.log(buf); //
2.3 Buffer.from(string[, encoding])
创建包含传入string的新buffer
参数:
import { Buffer } from 'buffer'; const buf = Buffer.from('hello buffer'); console.log(buf); //
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); //
3.1 Buffer.from(buffer)
参数:
import { Buffer } from 'buffer'; // 新建 const buf1 = Buffer.alloc(10, 2); // 复制 const buf2 = Buffer.from(buf1); console.log(buf1); //console.log(buf2); //
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复制到buf2 buf1.copy(buf2); console.log(buf1); //console.log(buf2); //
4.1 Buffer.concat(list[, totalLength])
返回list中所有buffer实例连接在一起的新buffer
参数:
注意
버퍼(임시 저장 영역)
의 메모리에 저장되어 처리됩니다.
1.1 버퍼 메모리 할당 이해
1.2 버퍼의 전역적 특성
노드는 프로세스가 시작될 때 이미 버퍼를 메모리에 설치하고 이를 사용할 때 전역 객체에 넣을 수 있습니다. 공식에서는 이를 가져오거나 명시적으로 참조하도록 요구합니다.
2. 버퍼 생성파일을 읽고 http 요청을 얻는 것 외에도 버퍼 인스턴스를 수동으로 구성하고 생성할 수도 있습니다. 2.1 Buffer.alloc(size[, fill[, 인코딩]])매개변수: size: 버퍼 길이 fill: 미리 채워진 값, 기본값: 0encoding: if fill은 문자열이며 문자열의 인코딩입니다. 기본값: utf-8import { Buffer } from 'buffer'; const buf1 = Buffer.alloc(4, 2); const buf2 = Buffer.alloc(4, 3); const buf3 = Buffer.concat([buf1, buf2]); console.log(buf1); //console.log(buf2); // console.log(buf3); //
import { Buffer } from 'buffer'; const buf1 = Buffer.alloc(10, 2); // 截取 const buf2 = buf1.slice(1,4); // 截取部分修改 buf2[0] = 0x63; console.log(buf1); //console.log(buf2); //
import { Buffer } from 'buffer'; const buf1 = Buffer.allocUnsafe(8).fill(2); console.log(buf1); //
0
~255
array
범위의 바이트 사용 할당 새로운버퍼
.
import { Buffer } from 'buffer'; // buf1 length为12 const buf1 = Buffer.alloc(12, 3); // write offset大于buf1.length,写入无效 buf1.write('hello', 12); console.log(buf1); //// 部分写入 buf1.write('hello', 10); //
import { Buffer } from 'buffer'; const buf1 = Buffer.alloc(12, 3); console.log(Buffer.isBuffer(buf1)); // true
import { Buffer } from 'buffer'; console.log(Buffer.isEncoding('utf-8')) // true
참고
: 목록에 항목이 없거나 totalLength가 0인 경우 길이가 0인 새 버퍼가 반환됩니다. totalLength가 제공되지 않으면 목록의 버퍼 인스턴스에서 길이를 추가하여 계산됩니다.
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
import { Buffer } from 'buffer'; const buf1 = Buffer.alloc(10, 2); // 截取 const buf2 = buf1.slice(1,4); // 截取部分修改 buf2[0] = 0x63; console.log(buf1); //console.log(buf2); //
6.1 buf.fill(value[, offset[, end]][, encoding])
参数:
import { Buffer } from 'buffer'; const buf1 = Buffer.allocUnsafe(8).fill(2); console.log(buf1); //
6.2 buf.write(string[, offset[, length]][, encoding])
根据 encoding 中的字符编码将 string 写入 buf 的 offset 处。
注意
:length 参数是要写入的字节数。 如果 buf 没有足够的空间来容纳整个字符串,则只会写入 string 的一部分
参数:
import { Buffer } from 'buffer'; // buf1 length为12 const buf1 = Buffer.alloc(12, 3); // write offset大于buf1.length,写入无效 buf1.write('hello', 12); console.log(buf1); //// 部分写入 buf1.write('hello', 10); //
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
Buffer转String
8.1 buf.toString([encoding[, start[, end]]])
参数:
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])
参数:
import { Buffer } from 'buffer'; const buf = Buffer.from('hello buffer'); console.log(buf); //
9.1 与Array类似点
9.2 与Array不同之处
위 내용은 버퍼란 무엇입니까? Nodejs의 버퍼 모듈에 대해 자세히 알아보세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!