Heim >Web-Frontend >js-Tutorial >Was ist Puffer? Erfahren Sie mehr über das Puffermodul in Nodejs
Was ist Puffer? Der folgende Artikel vermittelt Ihnen ein detailliertes Verständnis des Puffermoduls in Nodejs und stellt die Methoden zum Erstellen, Kopieren, Spleißen, Abfangen, Füllen von Puffern und Konvertieren von Puffern und Strings vor !
Wir wissen, dass JS über entsprechende Methoden-APIs zum Betreiben von Zeichenfolgen, Arrays, Zahlen, booleschen Werten usw. verfügt und in Node auch Dateioperationen, Netzwerkkommunikation, Datenbankoperationen, Datenübertragung und andere Funktionen erfordert Auf Ebene werden sie alle in binärer Form ausgedrückt. Die Datenübertragung in HTTP-Anfragen und -Antworten erfolgt ebenfalls in binären Daten, sodass die aktuellen JS-Funktionen allein nicht ausreichen, sodass das Puffermodul in Node bereitgestellt wird.
Das heißt: NodeJS die Möglichkeit geben, Binärdaten wie Strings zu manipulieren. Der Puffer wird auch als temporärer Speicherbereich
bezeichnet. Dabei handelt es sich um einen Speicherabschnitt, in dem Eingabe- und Ausgabebinärdaten vorübergehend gespeichert werden. 临时性暂存区
,即临时存放输入和输出二进制数据的一段内存。
在之前的一篇文章聊聊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
参数:
注意
Puffers (temporärer Speicherbereich)
gespeichert, um verarbeitet zu werden. 1.2 Die globale Natur des Puffers
Der Knoten hat den Puffer bereits im Speicher installiert und fügt ihn in das globale Objekt ein, wenn er verwendet wird Der Beamte empfiehlt weiterhin, es zu importieren oder eine explizite Referenz darauf anzugeben.
2. Puffer erstellen🎜🎜🎜Neben dem Lesen von Dateien und dem Erhalten von HTTP-Anfragen können Pufferinstanzen auch manuell erstellt und erstellt werden. 🎜🎜🎜🎜2.1 Buffer.alloc(size[, fill[,coded]])🎜🎜🎜🎜Parameter: 🎜🎜🎜size: Pufferlänge 🎜🎜fill: vorab ausgefüllter Wert, Standardwert: 0🎜🎜encoding: if fill ist eine Zeichenfolge, es ist die Kodierung der Zeichenfolge. Standard: 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)🎜🎜🎜🎜Parameter: 🎜🎜🎜Größe: Die erforderliche Länge des neuen Puffers🎜 🎜 basiert darauf. Der zugrunde liegende Speicher der auf diese Weise erstellten Pufferinstanzen wird nicht initialisiert. Der Inhalt des neu erstellten Puffers ist unbekannt und kann vertrauliche Daten enthalten. 🎜🎜
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[, Kodierung])🎜🎜🎜🎜Erstellen Sie einen neuen Puffer, der die eingehende Zeichenfolge enthält🎜🎜Parameter: 🎜🎜🎜Zeichenfolge: Zeichenfolge 🎜🎜Kodierung: Kodierung, Standardwert: 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)🎜🎜🎜🎜Verwenden Sie Bytes im Bereich von
0
– 255
array
Zuweisen ein neuer Puffer
. 3. Puffer kopieren buf.copy (Ziel[ , targetStart[, sourceStart[, sourceEnd]]])🎜🎜🎜🎜Kopieren Sie die buf-Instanz in das Zielziel🎜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>🎜🎜4. Splice Buffer🎜🎜🎜🎜🎜4.1 Buffer.concat(list[, totalLength])🎜🎜 🎜🎜 Gibt einen neuen Puffer zurück, in dem alle Pufferinstanzen in der Liste miteinander verbunden sind. 🎜🎜🎜list:ce1f03efdfa3a50760234dcf9b3662a8 | 2352a1ddeafcbb075c98dd9a641f874c🎜🎜totalLength: Gesamtlänge der Verbindung. 🎜🎜🎜
Hinweis
: 🎜🎜🎜Wenn die Liste keine Einträge enthält oder totalLength 0 ist, wird ein neuer Puffer mit der Länge Null zurückgegeben. 🎜🎜Wenn totalLength nicht angegeben ist, wird es aus den Pufferinstanzen in der Liste berechnet, indem deren Längen addiert werden. 🎜🎜import { Buffer } from 'buffer'; const buf1 = Buffer.alloc(12, 3); console.log(Buffer.isBuffer(buf1)); // true🎜🎜5. Intercept Buffer🎜🎜🎜🎜🎜5.1 buf.slice([start[, end]])🎜🎜🎜🎜Eine neue Buffer-Instanz von der buf-Instanz zurückgeben buf-Instanz Referenz, das heißt, Änderungen an der neu zurückgegebenen Instanz wirken sich auf die ursprüngliche Pufferinstanz aus🎜🎜Parameter:🎜
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 教程!!
Das obige ist der detaillierte Inhalt vonWas ist Puffer? Erfahren Sie mehr über das Puffermodul in Nodejs. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!