버퍼란 무엇입니까? 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 '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)
使用 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. 复制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复制到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:
| - totalLength: 连接总长度。
注意
- , 대용량 파일을 읽을 때 일반적으로 한꺼번에 메모리에 읽어들이는 것이 아니라, 데이터 블록을 스트림 형태로 읽어들이고, 연속적인 데이터 블록이 데이터 흐름의 개념이라는 것을 배웠습니다. 결성되었습니다. 데이터 블록을 읽고 쓰는 과정에서 데이터는 먼저
버퍼(임시 저장 영역)
의 메모리에 저장되어 처리됩니다. 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 '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>
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>
import { Buffer } from 'buffer'; const buf1 = Buffer.allocUnsafe(8).fill(2); console.log(buf1); // <Buffer 02 02 02 02 02 02 02 02>
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); // <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>
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
- 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为12 const 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 教程!!
위 내용은 버퍼란 무엇입니까? Nodejs의 버퍼 모듈에 대해 자세히 알아보세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제









Node.js와 Tomcat의 주요 차이점은 다음과 같습니다. 런타임: Node.js는 JavaScript 런타임을 기반으로 하는 반면 Tomcat은 Java Servlet 컨테이너입니다. I/O 모델: Node.js는 비동기식 비차단 모델을 사용하는 반면 Tomcat은 동기식 차단 모델을 사용합니다. 동시성 처리: Node.js는 이벤트 루프를 통해 동시성을 처리하는 반면 Tomcat은 스레드 풀을 사용합니다. 애플리케이션 시나리오: Node.js는 실시간, 데이터 집약적, 동시성 애플리케이션에 적합하고 Tomcat은 기존 Java 웹 애플리케이션에 적합합니다.

Node.js는 서버측 JavaScript 런타임인 반면, Vue.js는 대화형 사용자 인터페이스를 생성하기 위한 클라이언트측 JavaScript 프레임워크입니다. Node.js는 백엔드 서비스 API 개발, 데이터 처리 등 서버 측 개발에 사용되고, Vue.js는 단일 페이지 애플리케이션, 반응형 사용자 인터페이스 등 클라이언트 측 개발에 사용됩니다.

Node.js는 고성능, 확장성, 크로스 플랫폼 지원, 풍부한 생태계, 개발 용이성 등의 기능을 제공하므로 백엔드 프레임워크로 사용할 수 있습니다.

MySQL 데이터베이스에 연결하려면 다음 단계를 따라야 합니다. mysql2 드라이버를 설치합니다. mysql2.createConnection()을 사용하여 호스트 주소, 포트, 사용자 이름, 비밀번호 및 데이터베이스 이름이 포함된 연결 개체를 만듭니다. 쿼리를 수행하려면 Connection.query()를 사용하세요. 마지막으로 Connection.end()를 사용하여 연결을 종료합니다.

Node.js에는 다음과 같은 전역 변수가 존재합니다. 전역 개체: 전역 핵심 모듈: 프로세스, 콘솔, 필수 런타임 환경 변수: __dirname, __filename, __line, __column 상수: undefine, null, NaN, Infinity, -Infinity

Node.js 설치 디렉터리에는 npm과 npm.cmd라는 두 가지 npm 관련 파일이 있습니다. 차이점은 다음과 같습니다. 확장자가 다릅니다. npm은 실행 파일이고 npm.cmd는 명령 창 바로 가기입니다. Windows 사용자: npm.cmd는 명령 프롬프트에서 사용할 수 있으며, npm은 명령줄에서만 실행할 수 있습니다. 호환성: npm.cmd는 Windows 시스템에만 해당되며 npm은 크로스 플랫폼에서 사용할 수 있습니다. 사용 권장사항: Windows 사용자는 npm.cmd를 사용하고, 기타 운영 체제는 npm을 사용합니다.

예, Node.js는 백엔드 개발 언어입니다. 서버 측 비즈니스 로직 처리, 데이터베이스 연결 관리, API 제공 등 백엔드 개발에 사용됩니다.

Node.js와 Java의 주요 차이점은 디자인과 기능입니다. 이벤트 중심 대 스레드 중심: Node.js는 이벤트 중심이고 Java는 스레드 중심입니다. 단일 스레드 대 다중 스레드: Node.js는 단일 스레드 이벤트 루프를 사용하고 Java는 다중 스레드 아키텍처를 사용합니다. 런타임 환경: Node.js는 V8 JavaScript 엔진에서 실행되는 반면 Java는 JVM에서 실행됩니다. 구문: Node.js는 JavaScript 구문을 사용하고 Java는 Java 구문을 사용합니다. 목적: Node.js는 I/O 집약적인 작업에 적합한 반면, Java는 대규모 엔터프라이즈 애플리케이션에 적합합니다.
