Heim > Artikel > Web-Frontend > Ausführliche Erläuterung der Verwendung von Buffer zum Kodieren und Dekodieren von Binärdaten in Node.js_node.js?1.1.2
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 Textprotokolle wie HTTP verarbeiten, 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 bei 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 eines PuffersSie können einen Puffer aus einer UTF-8-Zeichenfolge wie folgt erstellen:
Der Code lautet wie folgt :
var buf = new Buffer(‘Hello World!');Sie können auch einen Puffer mit einer Zeichenfolge mit der angegebenen Codierung erstellen:
Der Code lautet 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:
Der Code lautet wie folgt:
var buf = new Buffer(1024); // 创建一个1024字节的缓冲Pufferdaten abrufen und festlegen
Nachdem Sie ein Pufferobjekt erstellt oder empfangen haben, möchten Sie möglicherweise dessen Inhalt anzeigen oder ändern. Sie können über den Operator [] auf ein bestimmtes Byte des Puffers zugreifen :
Der Code lautet wie folgt:
var buf = new Buffer('my buffer content'); // 访问缓冲内第10个字节 console.log(buf[10]); // -> 99
Der Code lautet wie folgt:
var buf = new Buffer(1024); console.log(buf[100]); // -> 5 (某个随机值)
Der Code lautet wie folgt:
buf[99] = 125; // 把第100个字节的值设置为125
1 Der maximale Wert der Bytes im Puffer beträgt 255. Wenn a Byte wird ein Wert größer als 256 zugewiesen. Die Zahl ist 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%6=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:
Der Code lautet wie folgt:
var buf = new Buffer(100); console.log(buf.length); // -> 100
Der Code lautet wie folgt:
var buf = new Buffer(100); for(var i = 0; i < buf.length; i++) { buf[i] = i; }Pufferdaten aufteilen
Sobald ein Puffer erstellt oder empfangen wurde, müssen Sie möglicherweise einen Teil der Pufferdaten extrahieren, indem Sie angeben die Startposition. Puffer, wodurch ein weiterer kleinerer Puffer erstellt wird:
Der Code lautet wie folgt:
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.
注意:如果你担心因此产生内存泄露问题,你可以使用copy方法来替代slice操作,下面将会介绍copy。
复制缓冲数据
你可以像这样用copy将缓冲的一部分复制到另外一个缓冲:
代码如下:
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"
上面代码,复制源缓冲的第9到20个字节到目标缓冲的开始位置。
解码缓冲数据
缓冲数据可以这样转换成一个UTF-8字符串:
代码如下:
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编码、解码二进制数据详解_node.js?1.1.2的内容,更多相关内容请关注PHP中文网(www.php.cn)!