Heim  >  Artikel  >  Web-Frontend  >  Eine kurze Analyse des Puffers in NodeJS

Eine kurze Analyse des Puffers in NodeJS

青灯夜游
青灯夜游nach vorne
2020-11-18 17:59:512599Durchsuche

Eine kurze Analyse des Puffers in NodeJS

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); // 值不确定,后面详谈
  • 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 e
    Buffer.from(string [, encoding])

    Gleichzeitig verfügt die Pufferinstanz auch über eine Tostring-Methode zum Konvertieren des Puffers in einen String

    buf.toString([encoding[, start[, end]]])
    E

    BUFFER-Stitching

    unter Verwendung der Concat-Methode, um anzugeben, dass mehrere Pufferinstanzen als Pufferinstanz
    Buffer.concat(list[, totalLength])
    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());
    }

    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));
    }
    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!

    Stellungnahme:
    Dieser Artikel ist reproduziert unter:cnblogs.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen
    Vorheriger Artikel:Wie debugge ich in node.js?Nächster Artikel:Wie debugge ich in node.js?