JavaScript ist sehr gut im Umgang mit Zeichenfolgen, aber da es ursprünglich für den Umgang mit HTML-Dokumenten entwickelt wurde, ist es nicht sehr gut im Umgang mit Binärdaten. JavaScript hat keinen Byte-Typ, keine strukturierten Typen, nicht einmal Byte-Arrays, nur Zahlen und Zeichenfolgen. (Originaltext: JavaScript hat keinen Byte-Typ – es hat nur Zahlen – oder strukturierte Typen oder http://skylitecellars.com/ sogar Byte-Arrays: Es hat nur Strings.)
Weil Node es ist Basierend auf JavaScript kann es natürlich mit Textprotokollen wie HTTP umgehen, Sie können es aber auch zur Interaktion mit Datenbanken, zum Hochladen von Bildern oder Dateien usw. verwenden. Sie können sich vorstellen, wie schwierig es wäre, diese Dinge nur mit Zeichenfolgen zu erledigen. Früher verarbeitete Node Binärdaten durch die Codierung von Bytes in Textzeichen. Dieser Ansatz erwies sich jedoch später als undurchführbar, ressourcenverschwendend, langsam, unflexibel und schwierig zu warten.
Knoten verfügt über eine binäre Pufferimplementierung Buffer. Diese Pseudoklasse stellt eine Reihe von APIs für die Verarbeitung binärer Daten bereit und vereinfacht Aufgaben, die die Verarbeitung binärer Daten erfordern. Die Länge des Puffers wird durch die Länge der Bytedaten bestimmt, und Sie können die Bytedaten im Puffer zufällig festlegen und abrufen.
Hinweis: Es gibt eine Besonderheit an der Buffer-Klasse. Der von den Bytedaten im Puffer belegte Speicher wird nicht auf dem VM-Speicherheap zugewiesen, was bedeutet, dass diese Objekte Wird nicht vom Garbage-Collection-Algorithmus von JavaScript verarbeitet, sondern durch eine permanente Speicheradresse ersetzt, die nicht geändert wird, wodurch auch CPU-Verschwendung vermieden wird, die durch das Kopieren von Pufferinhalten in den Speicher verursacht wird.
Erstellen Sie einen Puffer
Sie können einen Puffer mit einer UTF-8-Zeichenfolge wie folgt erstellen:
Sie können auch einen Puffer mit einer Zeichenfolge in a erstellen angegebene Kodierung:var buf = new Buffer(‘Hello World!');
var buf = new Buffer('8b76fde713ce', 'base64');
1.ascii – ASCI, gilt nur für den ASCII-Zeichensatz.
2.utf8 – UTF-8, diese Codierung mit variabler Breite ist für jedes Zeichen im Unicode-Zeichensatz geeignet. Sie ist zur bevorzugten Codierung in der Web-Welt geworden und ist auch der Standard-Codierungstyp von Node.3.base64 – Base64, diese Kodierung basiert auf 64 druckbaren ASCII-Zeichen zur Darstellung von Binärdaten. Base64 wird normalerweise zum Einbetten von Binärdaten in Zeichendokumente verwendet, die bei Bedarf in Zeichenfolgen umgewandelt werden können in das ursprüngliche Binärformat umwandeln.
Wenn keine Daten zum Initialisieren des Puffers vorhanden sind, können Sie einen leeren Puffer mit der angegebenen Kapazität erstellen:
var buf = new Buffer(1024); // 创建一个1024字节的缓冲
Erstellen oder empfangen Ein Puffer Nach dem Objekt möchten Sie möglicherweise dessen Inhalt anzeigen oder ändern. Sie können über den Operator [] auf ein bestimmtes Byte des Puffers zugreifen:
Hinweis: Wenn Sie (verwenden Sie die Pufferkapazitätsgröße to) Erstellen eines Wenn der Puffer initialisiert wurde, muss beachtet werden, dass die gepufferten Daten nicht auf 0 initialisiert werden, sondern zufällige Daten.var buf = new Buffer('my buffer content'); // 访问缓冲内第10个字节 console.log(buf[10]); // -> 99
var buf = new Buffer(1024); console.log(buf[100]); // -> 5 (某个随机值)
buf[99] = 125; // 把第100个字节的值设置为125
1. Der maximale Wert der Bytes im Puffer beträgt 255. Wenn einem Byte eine Nummer größer als 256 zugewiesen wird, ist es Modulo 256 und das Ergebnis wird diesem Byte zugewiesen.
2. Wenn einem bestimmten Byte im Puffer der Wert 256 zugewiesen wird, ist sein tatsächlicher Wert 0 (Anmerkung des Übersetzers: Tatsächlich wiederholt mit dem ersten, 256%256=0)3 Bei Verwendung von A Die Gleitkommazahl weist einem bestimmten Byte im Puffer einen Wert zu, z. B. 100,7. Der tatsächliche Wert ist der ganzzahlige Teil der Gleitkommazahl – 100
4 Wenn die Pufferkapazität überschritten wird, schlägt der Zuweisungsvorgang fehl. Der Puffer wird in keiner Weise geändert.
Sie können das Längenattribut verwenden, um die Länge des Puffers zu erhalten:
var buf = new Buffer(100); console.log(buf.length); // -> 100
var buf = new Buffer(100); for(var i = 0; i < buf.length; i++) { buf[i] = i; }
Pufferdaten aufteilen
Sobald Sie einen Puffer erstellt oder empfangen haben, müssen Sie möglicherweise einen Teil der Pufferdaten extrahieren. Sie können den vorhandenen Puffer aufteilen, indem Sie die Startposition angeben, um einen weiteren, kleineren Puffer zu erstellen Puffer:
Beachten Sie, dass beim Teilen eines Puffers kein neuer Speicher zugewiesen oder kopiert wird. Der neue Puffer verwendet nur einen bestimmten Teil der vom übergeordneten Puffer gepufferten Daten. (durch die Startposition vorgegeben). Diese Passage enthält mehrere Bedeutungen.var buffer = new Buffer("this is the content of my buffer"); var smallerBuffer = buffer.slice(8, 19); console.log(smallerBuffer.toString()); // -> "the content"
Wenn Ihr Programm zunächst den Inhalt des übergeordneten Puffers ändert, wirken sich diese Änderungen auch auf die zugehörigen untergeordneten Puffer aus, da der übergeordnete Puffer und der untergeordnete Puffer unterschiedliche JavaScript-Objekte sind und daher leicht ignoriert werden können dieses Problem verursachen und einige potenzielle Fehler verursachen.
Zweitens: Wenn Sie auf diese Weise einen kleineren untergeordneten Puffer aus dem übergeordneten Puffer erstellen, bleibt das übergeordnete Pufferobjekt nach Abschluss des Vorgangs erhalten und wird nicht durch Müll gesammelt , Es kann leicht zu Speicherverlusten kommen.
Hinweis: Wenn Sie sich Sorgen über Speicherverluste machen, können Sie die Kopiermethode anstelle der unten vorgestellten Slice-Operation verwenden.
Pufferdaten kopieren
Sie können Kopieren verwenden, um einen Teil des Puffers wie folgt in einen anderen Puffer zu kopieren:
Der obige Code kopiert den 9. bis 9. Teil von 20 Bytes bis zum Anfang des Zielpuffers.var buffer1 = new Buffer("this is the content of my buffer"); var buffer2 = new Buffer(11); var targetStart = 0; var sourceStart = 8; var sourceEnd = 19; buffer1.copy(buffer2, targetStart, sourceStart, sourceEnd); console.log(buffer2.toString()); // -> "the content"
Gepufferte Daten dekodieren
Gepufferte Daten können wie folgt in eine UTF-8-Zeichenfolge konvertiert werden:
var str = buf.toString();
还可以通过指定编码类型来将缓冲数据解码成任何编码类型的数据。比如,你想把一个缓冲解码成base64字符串,可以这么做:
var b64Str = buf.toString("base64");
使用toString函数,你还可以把一个UTF-8字符串转码成base64字符串:
var utf8String = 'my string'; var buf = new Buffer(utf8String); var base64String = buf.toString('base64')
小结
有时候,你不得不跟二进制数据打交道,但是原生JavaScript又没有明确的方式来做这件事,于是Node提供了Buffer类,封装了一些针对连续内存块的操作。你可以在两个缓冲之间切分或复制内存数据。
你也可以把一个缓冲转换成某种编码的字符串,或者反过来,把一个字符串转化成缓冲,来访问或处理每个bit。
更多Node.js中使用Buffer编码、解码二进制数据详解相关文章请关注PHP中文网!