Möchten Sie Buffer in Node.js besser verstehen? Überprüfen Sie dies heraus.

Sind Sie immer ein Rätsel, wie ich, wann immer Sie über Worte wie kommen Buffer, Stream, und Binärdaten inNode.js? Schreckt dieses Gefühl Sie davor zurück, sie zu verstehen und zu denken, dass sie nicht für Sie bestimmt sind, sondern nur für Node.js Gurus und Paketentwickler, um sie zu verstehen?

In der Tat können diese Wörter sehr einschüchternd sein, insbesondere wenn Sie mit Node.js ohne CS-Abschluss in die Webentwicklung einsteigen.

Leider lernen viele Tutorials und Bücher direkt, wie man Webanwendungen mit Node.js-Paketen entwickelt, ohne dass Sie die Kernfunktionen von Node.js und deren Existenz verstehen. Und einige werden Ihnen dreist sagen, dass Sie sie nicht verstehen müssen, weil Siekönnte nie direkt mit ihnen arbeiten.

Nun, es stimmt, Sie könnten niemals direkt mit ihnen arbeiten, wenn Sie sich dafür entscheiden, ein durchschnittlicher Node.js-Entwickler zu bleiben.

Wenn Sie jedoch durch Rätsel wirklich neugierig werden und vor nichts zurückschrecken, um Ihre Neugier zu befriedigen, und wenn Sie das Verständnis von Node.j auf die nächste Ebene heben möchten, möchten Sie wirklich tiefer gehen, um die vielen Kernfunktionen zu verstehen von Node.js, wie zum Beispiel Buffer . Und genau deshalb schreibe ich dieses Stück - um uns zu helfen, einige dieser Funktionen zu entmystifizieren und das Lernen unserer Node.js auf die nächste Stufe zu bringen.

Bei der Einführung von Buffer heißt es in den offiziellen Node.js-Dokumenten teilweise…

… Mechanismus zum Lesen oder Bearbeiten von Binärdatenströmen. Die BufferKlasse wurde als Teil der Node.js-API eingeführt, um die Interaktion mit Oktett-Streams im Kontext von TCP-Streams und Dateisystemoperationen zu ermöglichen.

Hmmm, wenn Sie nicht alle Wörter in den obigen Sätzen vorher gekannt haben, sind sie wahrscheinlich nur ein Haufen Jargon. Versuchen wir, dies ein wenig zu vereinfachen, indem wir es umformulieren, damit wir einen klaren Fokus haben und uns nicht von den vielen Schnickschnack ablenken lassen. Aus dieser Einführung können wir mit Sicherheit sagen:

Die BufferKlasse wurde als Teil der Node.js-API eingeführt, um die Bearbeitung oder Interaktion mit Binärdatenströmen zu ermöglichen.

Das ist doch einfacher, oder? Aber… Puffer, Streams, Binärdaten… immer noch viele große Wörter. Versuchen wir, diese großen Worte vom letzten bis zum ersten zu behandeln.

Binärdaten, was ist das?

Sie wissen wahrscheinlich bereits, dass Computer Daten in Binärdateien speichern und darstellen. Binär ist einfach ein Satz oder eine Sammlung von Einsen und Nullen. Das Folgende sind beispielsweise fünf verschiedene Binärdateien, fünf verschiedene Sätze von Einsen und Nullen:

10, 01, 001, 1110,00101011

Jede Zahl in einer Binärzahl, jede 1und 0in einer Menge wird als Bit bezeichnet , eine Kurzform der Binärzahl.

Um ein Datenelement zu speichern oder darzustellen, muss ein Computer diese Daten in seine binäre Darstellung konvertieren. Um beispielsweise die Zahl 12 zu speichern, muss ein Computer 12 in seine Binärdarstellung konvertieren 1100.

Woher weiß ein Computer, wie diese Konvertierung durchgeführt wird? Nun, es ist reine Mathematik. Es ist das einfache binäre Zahlensystem, das wir in der Grundmathematik gelernt haben - eine Zahl im Basis-2-Zahlensystem auszudrücken. Computer verstehen diese Mathematik.

Zahlen sind jedoch nicht der einzige Datentyp, mit dem wir arbeiten. Wir haben auch Zeichenfolgen, Bilder und sogar Videos. Computer wissen, wie alle Arten von Daten in Binärdateien dargestellt werden. Nehmen wir zum Beispiel Strings. Wie wird ein Computer die Zeichenfolge "L" in Binärdateien darstellen? Um ein Zeichen in Binärdateien zu speichern, konvertieren Computer dieses Zeichen zuerst in eine Zahl und dann in seine Binärdarstellung. Also für die Zeichenfolge "L",Computer konvertieren zuerst L in eine Zahl, die L darstellt . Mal sehen wie.

Öffnen Sie Ihre Browserkonsole, fügen Sie das folgende Codefragment ein und drücken Sie die Eingabetaste : "L".charCodeAt(0). Was hast du gesehen? Die Nummer 76? Das ist die Zahlendarstellung oder Zeichencode oder Code Point des Zeichens L . Aber woher weiß ein Computer, welche genaue Zahl jedes Zeichen darstellt? Woher weiß es, die Zahl 76 zu verwenden, um L darzustellen ?

Zeichensätze

Zeichensätze sind bereits definierte Regeln dafür, welche genaue Zahl jedes Zeichen darstellt. Wir haben unterschiedliche Definitionen dieser Regeln. Zu den sehr beliebten gehören Unicode und ASCII . JavaScript spielt sehr gut mit Unicode-Zeichensätzen. Tatsächlich gibt der Unicode in Ihrem Browser an, dass 76 L darstellen soll .

Wir haben also gesehen, wie Computer Zeichen in Zahlen darstellen. Nun wird der Computer wiederum die Zahl 76 in seiner binären Darstellung darstellen. Sie könnten denken, konvertieren Sie einfach 76 in das Basis-2-Zahlensystem. Nicht so schnell!

Zeichenkodierung

So wie es Regeln gibt, die definieren, welche Zahl ein Zeichen darstellen soll, gibt es auch Regeln, die definieren, wie diese Zahl in Binärdateien dargestellt werden soll. Insbesondere, wie viele Bits zur Darstellung der Zahl verwendet werden sollen. Dies wird als Zeichenkodierung bezeichnet .

Eine der Definitionen für die Zeichenkodierung ist UTF-8 . UTF-8 gibt an, dass Zeichen in Bytes codiert werden sollen . Ein Byte ist ein Satz von acht Bits - acht Einsen und Nullen. Daher sollten acht Einsen und Nullen verwendet werden, um den Codepunkt eines beliebigen Zeichens in Binärform darzustellen.

Um dies zu verstehen, ist, wie bereits erwähnt, die binäre Darstellung der Zahl 12 1100. Wenn UTF-8 angibt, dass 12 in acht Bits vorliegen soll, sagt UTF-8, dass ein Computer mehr Bits auf der linken Seite der tatsächlichen Basis-2-Darstellung der Zahl 12 hinzufügen muss, um daraus ein Byte zu machen. Also sollte 12 als gespeichert werden 00001100. Macht Sinn?

Daher sollte 76 als gespeichert werden 01001100.

So speichern meine Computer Zeichenfolgen oder Zeichen in Binärdateien. Ebenso haben Computer Regeln festgelegt, wie Bilder und Videos konvertiert oder codiert und in Binärdateien gespeichert werden sollen. Der Punkt hier ist, dass Computer alle Datentypen in Binärdateien speichern, und dies wird als Binärdaten bezeichnet.

Wenn Sie sich sehr für das Wesentliche der Zeichenkodierung interessieren, könnte Ihnen diese sanfte und detaillierte Einführung gefallen.

Jetzt verstehen wir, was Binärdaten sind, aber was sind Ströme von Binärdatenvon unserer Einführung zum Puffer?

Strom

Stream in Node.js bedeutet einfach eine Folge von Daten, die im Laufe der Zeit von einem Punkt zum anderen verschoben werden. Das ganze Konzept ist, dass Sie eine große Datenmenge verarbeiten müssen, aber nicht warten müssen, bis alle Daten verfügbar sind, bevor Sie mit der Verarbeitung beginnen.

Grundsätzlich werden diese großen Datenmengen aufgeteilt und in Blöcken gesendet. Ausgehend von der ursprünglichen Definition eines Puffers („Streams von Binärdaten… im Kontext von… Dateisystem“) bedeutet dies einfach, dass Binärdaten im Dateisystem verschoben werden. Verschieben Sie beispielsweise die in file1.txt gespeicherten Texte nach file2.txt.

Aber wie genau hilft uns Puffer, beim Streaming mit Binärdaten zu interagieren oder diese zu manipulieren? Was genau ist dieser Puffer übrigens?

Puffer

Wir haben gesehen, dass ein Datenstrom die Bewegung von Daten von einem Punkt zum anderen ist, aber wie genau werden sie verschoben?

In der Regel werden Daten verschoben, um sie zu verarbeiten oder zu lesen und basierend darauf Entscheidungen zu treffen. Es gibt jedoch eine minimale und eine maximale Datenmenge, die ein Prozess im Laufe der Zeit in Anspruch nehmen kann. Wenn also die Rate, mit der die Daten ankommen, schneller ist als die Rate, mit der der Prozess die Daten verbraucht, müssen die überschüssigen Daten irgendwo warten, bis sie an der Reihe sind.

Wenn der Prozess hingegen die Daten schneller verbraucht als sie eintreffen, müssen die wenigen Daten, die früher eintreffen, auf das Eintreffen einer bestimmten Datenmenge warten, bevor sie zur Verarbeitung gesendet werden.

Dieser "Wartebereich " ist der Puffer! Es ist ein kleiner physischer Ort in Ihrem Computer, normalerweise im RAM, an dem Daten zeitlich erfasst werden, warten und schließlich während des Streamings zur Verarbeitung gesendet werden.

Wir können uns den gesamten Stream- und Pufferprozess als Bushaltestelle vorstellen. In einigen Bushaltestellen darf ein Bus erst abfahren, wenn eine bestimmte Anzahl von Fahrgästen ankommt oder bis zu einer bestimmten Abfahrtszeit. Außerdem können die Passagiere zu unterschiedlichen Zeiten mit unterschiedlicher Geschwindigkeit ankommen. Weder die Fahrgäste noch der Busbahnhof haben Kontrolle über die Ankunft der Fahrgäste am Bahnhof.

In jedem Fall müssen Passagiere, die früher anreisen, warten, bis der Busbahnhof beschließt, den Bus auf den Weg zu schicken. Während Fahrgäste, die ankommen, wenn der Bus bereits beladen ist oder wenn der Bus bereits abgefahren ist, auf den nächsten Bus warten müssen .

In jedem Fall gibt es immer einen Warteplatz. Das ist der Puffer für Node.js! Node.js kann die Geschwindigkeit oder Zeit des Datenankunfts, die Geschwindigkeit des Streams, nicht steuern. Es kann nur entscheiden, wann es Zeit ist, die Daten zu versenden. Wenn es noch nicht soweit ist, legt Node.js sie in den Puffer - den „Wartebereich“ - eine kleine Stelle im RAM, bis es Zeit ist, sie zur Verarbeitung zu senden.

Ein typisches Beispiel, bei dem Sie Puffer in Aktion sehen können, ist das Online-Streaming eines Videos. Wenn Ihre Internetverbindung schnell genug ist, ist die Geschwindigkeit des Streams schnell genug, um den Puffer sofort zu füllen und zur Verarbeitung auszusenden. Füllen Sie dann einen anderen und senden Sie ihn aus, dann noch einen und noch einen ... bis zum Stream ist fertig.

Wenn Ihre Verbindung jedoch langsam ist, zeigt der Videoplayer nach der Verarbeitung des ersten eingetroffenen Datensatzes ein Ladesymbol oder den Text „Pufferung“ an. Dies bedeutet, dass mehr Daten erfasst werden oder auf das Eintreffen weiterer Daten gewartet wird. Und wenn der Puffer gefüllt und verarbeitet ist, zeigt der Player die Daten, das Video. Während des Spielens kommen weiterhin weitere Daten an und warten im Puffer.

Wenn der Player mit der Verarbeitung oder Wiedergabe der vorherigen Daten fertig ist und der Puffer noch nicht gefüllt ist, wird der Text „Pufferung“ erneut angezeigt und wartet darauf, weitere Daten für die Verarbeitung zu sammeln.

Das ist Puffer!

Aus der ursprünglichen Definition eines Puffers geht hervor, dass wir im Puffer die gestreamten Binärdaten manipulieren oder mit ihnen interagieren können. Welche Art von Interaktion könnten wir möglicherweise mit diesen binären Rohdaten haben? Die Pufferimplementierung in Node.js bietet uns eine vollständige Liste der möglichen Aktionen. Lassen Sie uns einige von ihnen sehen.

Interaktion mit einem Puffer

Es ist sogar möglich, einen eigenen Puffer zu erstellen! Abgesehen davon, dass Node.js während eines Streams automatisch erstellt wird, ist es möglich, einen eigenen Puffer zu erstellen und zu bearbeiten. Interessant, oder? Lassen Sie uns eine erstellen!

Je nachdem, was Sie erreichen möchten, gibt es verschiedene Möglichkeiten, einen Puffer zu erstellen. Mal sehen.

// Create an empty buffer of size 10. // A buffer that only can accommodate 10 bytes.
const buf1 = Buffer.alloc(10);
// Create a buffer with content
const buf2 = Buffer.from("hello buffer");

Sobald Ihr Puffer erstellt wurde, können Sie mit ihm interagieren

// Examine the structure of a buffer
buf1.toJSON()// { type: 'Buffer', data: [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] }// an empty buffer
buf2.toJSON()// { type: 'Buffer', data: [ 104, 101, 108, 108, 111, 32, 98, 117, 102, 102, 101, 114 ] }
// the toJSON() method presents the data as the Unicode Code Points of the characters
// Examine the size of a buffer
buf1.length // 10
buf2.length // 12. Auto-assigned based on the initial content when created.
// Write to a bufferbuf1.write("Buffer really rocks!") 
// Decode a buffer
buf1.toString() // 'Buffer rea'
//oops, because buf1 is created to contain only 10 bytes, it couldn't accommodate the rest of the characters
// Compare two buffers

Es gibt eine Menge Interaktionen, die wir mit einem Puffer haben könnten. Besuchen Sie die offiziellen Dokumente, um mehr über diese Methoden zu erfahren.

Abschließend möchte ich Sie mit dieser kleinen Herausforderung belassen : Lesen Sie die Quelle von zlib.js , einer der Kernbibliotheken von Node.js, durch, um zu sehen, wie die Kraft des Puffers zur Manipulation von Binärdatenströmen genutzt wird. Dies sind gziped-Dateien. Dokumentieren Sie beim Lesen, was Sie gelernt haben, und teilen Sie es uns hier in den Kommentaren mit.

Ich hoffe, diese Einführung hat Ihnen geholfen, Node.js Buffer besser zu verstehen.

Wenn Sie das Gefühl haben, dass ich gute Arbeit geleistet habe und andere eine Chance verdienen, dies zu sehen, klatschen Sie bitte in den Artikel, um ein besseres Verständnis von Buffer in unserer Node.js-Community zu verbreiten.

Wenn Sie eine Frage haben, die nicht beantwortet wurde, oder einige der Punkte hier anders verstehen, können Sie hier oder über Twitter Kommentare abgeben.