Heim  >  Artikel  >  Web-Frontend  >  Ausführliche Erläuterung der Verwendung von Buffer zum Kodieren und Dekodieren von Binärdaten in Node.js

Ausführliche Erläuterung der Verwendung von Buffer zum Kodieren und Dekodieren von Binärdaten in Node.js

高洛峰
高洛峰Original
2017-02-04 09:51:101570Durchsuche

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

Akzeptable Zeichenkodierungen und Bezeichner sind wie folgt:
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:

Pufferdaten abrufen und festlegen
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

Sie können die Daten an jeder Stelle im Puffer wie folgt ändern:
var buf = new Buffer(1024);
console.log(buf[100]); // -> 5 (某个随机值)

Hinweis: In einigen Fällen verursachen einige Puffervorgänge keine Fehler, wie zum Beispiel:
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:

Sie können die Pufferlänge auch verwenden, um über den Inhalt des Puffers zu iterieren, um jedes Byte zu lesen oder festzulegen :
var buf = new Buffer(100);
console.log(buf.length); // -> 100

Der obige Code erstellt einen neuen Puffer mit 100 Bytes und setzt jedes Byte im Puffer von 0 auf 99.
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 = &#39;my string&#39;;
var buf = new Buffer(utf8String);
var base64String = buf.toString(&#39;base64&#39;)

小结

有时候,你不得不跟二进制数据打交道,但是原生JavaScript又没有明确的方式来做这件事,于是Node提供了Buffer类,封装了一些针对连续内存块的操作。你可以在两个缓冲之间切分或复制内存数据。

你也可以把一个缓冲转换成某种编码的字符串,或者反过来,把一个字符串转化成缓冲,来访问或处理每个bit。

更多Node.js中使用Buffer编码、解码二进制数据详解相关文章请关注PHP中文网!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn