Verwandte Empfehlungen: „node js-Tutorial“
Damals habe ich „Nine Lights and One Deep NodeJS“ von Pu Ling gelesen, um mit Node zu beginnen Nachdem ich mir so viele Wahrheiten angehört hatte, begann ich, NodeJS im Bereich Front-End-Engineering zu verwenden, stieß jedoch überall auf Einschränkungen: Die schwierigen Teile von NodeJS sind nichts weiter als Dateien und Netzwerke Beide basieren auf einem sehr wichtigen Objekt – Stream. Genau das hat Park in seinem Buch nicht erwähnt.
Buffer Park Dada hat es im Buch erwähnt, aber da der Stream tatsächlich den Puffer verarbeitet, muss es noch kurz zusammengefasst werden.
Was ist Puffer? Wie in der offiziellen API eingeführt, verfügte JavaScript vor der Einführung von TypedArray durch ES6 über keinen Mechanismus zum Lesen oder Betreiben binärer Datenströme. Die Buffer-Klasse wurde als Teil der NodeJS-API eingeführt, um mit Netzwerkströmen wie TCP und Dateiströmen interagieren zu können.
Nachdem TypedArray zu ES6 hinzugefügt wurde, implementiert die Buffer-Klasse die Unit8Array-API auf eine Weise, die optimierter und für NodeJS-Operationen geeigneter ist.
Kurz gesagt, die Buffer-Klasse wird zum Verarbeiten von Binärdaten verwendet und ist daher nicht erforderlich, wenn sie verwendet wird.
Instanzen der Buffer-Klasse ähneln Integer-Arrays, die Größe des Puffers wird jedoch beim Erstellen festgelegt und kann nicht angepasst werden. Der Unterschied zum Buffer-Objekt besteht darin, dass es nicht den Speicherzuweisungsmechanismus von V8 durchläuft. Buffer ist ein Modul, das JavaScript und C++ kombiniert. Der Speicher wird von C++ beantragt und von JavaScript zugewiesen.
Wir werden nicht auf das damit verbundene Wissen über die Pufferspeicherzuweisung eingehen. Interessierte Schüler können das Buch von Park Laoshi lesen.
Puffer instanziieren
Vor NodeJS v6 wurde Buffer durch Aufrufen des Konstruktors instanziiert und lieferte je nach Parameter unterschiedliche Ergebnisse. Aus Sicherheitsgründen wurde diese Methode in Versionen nach v6 abgeschafft und es werden drei separate Methoden bereitgestellt:
Buffer.from()
Buffer.alloc()- Buffer.allocUnsafe()
-
- Funktionen mit klaren Verantwortlichkeiten Erledigen Sie die Arbeit der Instanziierung des Puffers.
Buffer.from(array): Gibt einen Puffer zurück, der eine Kopie des bereitgestellten Bytes enthält. Jedes Element im Array ist eine Zahl, die ein Oktett darstellt, daher muss der Wert zwischen 0 und 255 liegen, andernfalls handelt es sich um einen Modulo
Buffer .from(arrayBuffer): Gibt einen neuen Puffer zurück, der den Speicher mit dem angegebenen ArrayBuffer teilt. - Buffer.from(buffer): Gibt eine Kopie des angegebenen Puffers zurück. Buffer
- Buffer.from(string [, Kodierung]): Gibt einen Puffer zurück enthält die angegebene Zeichenfolge
- Buffer.alloc(size [, fill [,kodierung]]): Gibt einen Puffer der angegebenen Größe und „gefüllt“ zurück
- Buffer.allocUnsafe(size): Gibt den angegebenen Puffer unterschiedlicher Größe zurück Inhalte müssen mit Methoden wie buf.fill(0) gefüllt werden.
-
// 0x 表示 16 进制
Buffer.from([1, 2, 3]) // [0x1, 0x2, 0x3]
Buffer.from('test', 'utf-8') // [0x74, 0x65, 0x73, 0x74]
Buffer.alloc(5, 1) // [0x1, 0x1, 0x1, 0x1, 0x1]
Buffer.allocUnsafe(5); // 值不确定,后面详谈
Nach dem Login kopieren
Buffer.allocUnsafe()
wird schneller ausgeführt als Buffer.alloc()
Siehe Namen sind unsicher , in der Tat unsicher. Das beim Aufruf von
Buffer.allocUnsafe()
zugewiesene Speichersegment wurde nicht initialisiert (nicht auf Null zurückgesetzt), sodass die Speicherzuweisungsgeschwindigkeit sehr langsam ist, das zugewiesene Speichersegment jedoch möglicherweise alte Daten enthält . Wenn Sie diese alten Daten bei der Verwendung nicht überschreiben, kann es zu Speicherverlusten kommen. Obwohl es schnell ist, sollten Sie die Verwendung vermeiden.
Buffer.allocUnsafe()
的执行会快于 Buffer.alloc()
看名字很不安全,确实也不安全。
当调用 Buffer.allocUnsafe()
Encoding
Buffer unterstützt die folgenden Codierungsformate:
ascii
- utf8
- utf16le
- base64
- binary
- hex
-
Puffer- und String-Konvertierung
String-zu-Puffer-Vergleich Einfach eBuffer.from(string [, encoding])
Nach dem Login kopieren
Gleichzeitig verfügt die Pufferinstanz auch über eine Tostring-Methode zum Konvertieren des Puffers in einen String
buf.toString([encoding[, start[, end]]])
Nach dem Login kopieren
E
BUFFER-Stitching
unter Verwendung der Concat-Methode, um anzugeben, dass mehrere Pufferinstanzen als Pufferinstanz Buffer.concat(list[, totalLength])
Nach dem Login kopieren
e
stringCoder
zusammengefügt werden Ein chinesisches Zeichen wird durch drei Bytes dargestellt, wenn wir bei der Verarbeitung chinesischer Zeichen eine Anzahl von Bytes verwenden, die kein Vielfaches von 3 ist, führt dies zu Problemen beim Zusammenfügen verstümmelter Zeichen. const buf = Buffer.from('中文字符串!');
for(let i = 0; i < buf.length; i+=5){
var b = Buffer.allocUnsafe(5);
buf.copy(b, 0, i);
console.log(b.toString());
}
Nach dem Login kopieren
Auf diese Weise können Sie sehen, dass die Ergebnisse verstümmelte Zeichen enthalten
Aber wenn Sie das Modul string_decoder verwenden, können Sie dieses Problem lösen
const StringDecoder = require('string_decoder').StringDecoder;
const decoder = new StringDecoder('utf8');
const buf = Buffer.from('中文字符串!');
for(let i = 0; i < buf.length; i+=5){
var b = Buffer.allocUnsafe(5);
buf.copy(b, 0, i);
console.log(decoder.write(b));
}
Nach dem Login kopieren
StringDecoder Nachdem Sie die Codierung erhalten haben, wissen Sie, dass breite Bytes 3 belegen Bytes unter utf-8 , sodass bei der Verarbeitung unvollständiger Bytes am Ende diese bis zum zweiten write() beibehalten werden. Derzeit können nur UTF-8, Base64 und UCS-2/UTF-16LE verarbeitet werden.
Andere häufig verwendete APIs für Buffer
Es gibt auch einige häufig verwendete APIs für Buffer
- Buffer.isBuffer: Bestimmen Sie, ob das Objekt ein Buffer ist.
- Buffer.isEncoding: Bestimmen Sie die Codierung des Buffer-Objekts.
- buf.length: Geben Sie die Anzahl der für diese Buffer-Instanz angeforderten Speicherbytes zurück, nicht die Anzahl der Bytes des Inhalts der Buffer-Instanz
- buf.indexOf: Gibt ähnlich wie indexOf eines Arrays die Position einer bestimmten Zeichenfolge, eines ACSII-Codes oder Buffs im geänderten Buff zurück
- buf.copy: Kopiert (einen Teil) des Inhalts von einem Buff zum anderen Buff
Weitere Informationen zum Programmieren finden Sie unter: Programmiervideos! !
Das obige ist der detaillierte Inhalt vonEine kurze Analyse des Puffers in NodeJS. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!