버퍼란 무엇인가요? 다음 글은 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); // <Buffer 00 00 00 00 00 00 00 00>
2.2 Buffer.allocUnsafe(size)
参数:
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
参数:
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.1 Buffer.from(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.1 Buffer.concat(list[, totalLength])
返回list中所有buffer实例连接在一起的新buffer
参数:
注意
버퍼(임시 저장 영역)
의 메모리에 저장되어 처리됩니다. 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>🎜🎜🎜2.2 Buffer.allocUnsafe(size)🎜🎜🎜🎜매개변수: 🎜🎜🎜size: 새 버퍼의 필수 길이🎜 🎜 이를 기반으로 이렇게 생성된 Buffer 인스턴스의 기본 메모리는 초기화되지 않습니다. 새로 생성된 버퍼의 내용은 알 수 없으며 민감한 데이터를 포함할 수 있습니다. 🎜🎜
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>🎜🎜🎜2.3 Buffer.from(string[, 인코딩])🎜🎜🎜🎜들어오는 문자열을 포함하는 새 버퍼를 만듭니다🎜🎜매개변수: 🎜🎜🎜문자열: 문자열 🎜🎜encoding: 인코딩, 기본값: 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>🎜🎜🎜2.4 Buffer.from(array)🎜🎜🎜🎜
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>🎜🎜3. Copy Buffer🎜🎜🎜🎜🎜3.1 Buffer.from(buffer)🎜🎜🎜🎜매개변수: 🎜🎜🎜buffer, 복사할 버퍼 인스턴스🎜🎜
import { Buffer } from 'buffer'; const buf1 = Buffer.alloc(12, 3); console.log(Buffer.isBuffer(buf1)); // true🎜🎜🎜3.2 buf.copy (대상[ , targetStart[, sourceStart[, sourceEnd]]])🎜🎜🎜🎜buf 인스턴스를 대상 타겟에 복사합니다🎜
import { Buffer } from 'buffer'; console.log(Buffer.isEncoding('utf-8')) // true🎜🎜4. Splice Buffer🎜🎜🎜🎜🎜4.1 Buffer.concat(list[, totalLength])🎜🎜 🎜🎜 목록의 모든 버퍼 인스턴스가 함께 연결된 새 버퍼를 반환합니다.🎜🎜매개변수: 🎜🎜🎜list:ce1f03efdfa3a50760234dcf9b3662a8 2352a1ddeafcbb075c98dd9a641f874c🎜🎜totalLength: 연결의 총 길이. 🎜🎜🎜
참고
: 🎜🎜🎜목록에 항목이 없거나 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🎜🎜5. Intercept Buffer🎜🎜🎜🎜🎜5.1 buf.slice([start[, end]])🎜🎜🎜🎜buf 인스턴스에서 새 Buffer 인스턴스를 반환합니다. 반환된 새 Buffer 인스턴스는 바로 소스입니다. buf 인스턴스 참조, 즉 새로 반환된 인스턴스를 수정하면 원래 버퍼 인스턴스에 영향을 미칩니다🎜🎜매개변수:🎜
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.1 buf.fill(value[, offset[, end]][, encoding])
参数:
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 的一部分
参数:
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.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); // <Buffer 68 65 6c 6c 6f 20 62 75 66 66 65 72>
9.1 与Array类似点
9.2 与Array不同之处
更多node相关知识,请访问:nodejs 教程!!
위 내용은 버퍼란 무엇입니까? Nodejs의 버퍼 모듈에 대해 자세히 알아보세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!