Heim  >  Artikel  >  Web-Frontend  >  Verwenden Sie das Modul string_decoder in Nodejs, um den Puffer in einen String zu konvertieren

Verwenden Sie das Modul string_decoder in Nodejs, um den Puffer in einen String zu konvertieren

青灯夜游
青灯夜游nach vorne
2021-05-14 11:00:362627Durchsuche

In diesem Artikel erfahren Sie, wie Sie das Modul string_decoder in Nodejs zum Konvertieren von Puffer in einen String verwenden. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein.

Verwenden Sie das Modul string_decoder in Nodejs, um den Puffer in einen String zu konvertieren

Moduleinführung

Das Modul string_decoder wird verwendet, um Buffer in den entsprechenden String umzuwandeln. Benutzer können die dem Puffer entsprechende Zeichenfolge erhalten, indem sie stringDecoder.write(buffer) aufrufen. [Empfohlenes Lernen: „nodejs Tutorialstring_decoder模块用于将Buffer转成对应的字符串。使用者通过调用stringDecoder.write(buffer),可以获得buffer对应的字符串。【推荐学习:《nodejs 教程》】

它的特殊之处在于,当传入的buffer不完整(比如三个字节的字符,只传入了两个),内部会维护一个internal buffer将不完整的字节cache住,等到使用者再次调用stringDecoder.write(buffer)传入剩余的字节,来拼成完整的字符。

这样可以有效避免buffer不完整带来的错误,对于很多场景,比如网络请求中的包体解析等,非常有用。

入门例子

这节分别演示了decode.write(buffer)decode.end([buffer])两个主要API的用法。

例子一:

decoder.write(buffer)调用传入了Buffer对象4906621e4f28d4de4703165e1c48080e,相应的返回了对应的字符串;

const StringDecoder = require('string_decoder').StringDecoder;
const decoder = new StringDecoder('utf8');

// Buffer.from(&#39;你&#39;) => <Buffer e4 bd a0>
const str = decoder.write(Buffer.from([0xe4, 0xbd, 0xa0]));
console.log(str);  // 你

例子二:

decoder.end([buffer])被调用时,内部剩余的buffer会被一次性返回。如果此时带上buffer参数,那么相当于同时调用decoder.write(buffer)decoder.end()

const StringDecoder = require(&#39;string_decoder&#39;).StringDecoder;
const decoder = new StringDecoder(&#39;utf8&#39;);

// Buffer.from(&#39;你好&#39;) => <Buffer e4 bd a0 e5 a5 bd>
let str = decoder.write(Buffer.from([0xe4, 0xbd, 0xa0, 0xe5, 0xa5]));
console.log(str);  // 你

str = decoder.end(Buffer.from([0xbd]));
console.log(str);  // 好

例子:分多次写入多个字节

下面的例子,演示了分多次写入多个字节时,string_decoder模块是怎么处理的。

首先,传入了efba047232e9c30493e472f2bf6fc120还差1个字节,此时,decoder.write(xx)返回

然后,再次调用decoder.write(Buffer.from([0xbd])),将剩余的1个字节传入,成功返回

const StringDecoder = require(&#39;string_decoder&#39;).StringDecoder;
const decoder = new StringDecoder(&#39;utf8&#39;);

// Buffer.from(&#39;你好&#39;) => <Buffer e4 bd a0 e5 a5 bd>
let str = decoder.write(Buffer.from([0xe4, 0xbd, 0xa0, 0xe5, 0xa5]));
console.log(str);  // 你

str = decoder.write(Buffer.from([0xbd]));
console.log(str);  // 好

例子:decoder.end()时,字节数不完整的处理

decoder.end(buffer)时,仅传入了的第1个字节,此时调用decoder.end(),返回了,对应的buffer为bc19c5c32cd20c3c3f2e331d6251d270

const StringDecoder = require(&#39;string_decoder&#39;).StringDecoder;

// Buffer.from(&#39;好&#39;) => <Buffer e5 a5 bd>
let decoder = new StringDecoder(&#39;utf8&#39;);
let str = decoder.end( Buffer.from([0xe5]) );
console.log(str);  // �
console.log(Buffer.from(str));  // <Buffer ef bf bd>

官方文档对于这种情况的解释是这样的(跟废话差不多),大约是约定俗成了,当utf8码点无效时,替换成ef bf bd"]

Es ist etwas Besonderes Der Punkt ist, dass, wenn der eingehende Puffer unvollständig ist (z. B. werden nur zwei der Drei-Byte-Zeichen übergeben), intern ein interner Puffer verwaltet, um die unvollständigen Bytes zwischenzuspeichern, bis der Benutzer stringDecoder.write(buffer) aufruft )Übergeben Sie die verbleibenden Bytes, um vollständige Zeichen zu buchstabieren.

Dadurch können Fehler, die durch unvollständigen Puffer verursacht werden, wirksam vermieden werden, was für viele Szenarien sehr nützlich ist, z. B. für das Parsen des Paketkörpers in Netzwerkanforderungen usw.

Beispiel für den ersten Schritt

Dieser Abschnitt demonstriert decode.write(buffer) und decode.end([buffer])Verwendung von zwei Haupt-APIs. <p></p>Beispiel 1: <p><a href="https://www.php.cn/course.html" target="_blank" textvalue="编程视频"><code>decoder.write(buffer)-Aufruf übergibt das Pufferobjekt 4906621e4f28d4de4703165e1c48080e und die entsprechende Zeichenfolge wird entsprechendSie

;rrreeeBeispiel 2:🎜🎜Wenn decoder.end([buffer]) aufgerufen wird, wird der verbleibende interne Puffer sofort zurückgegeben. Wenn Sie zu diesem Zeitpunkt den Parameter buffer verwenden, entspricht dies dem Aufruf von decoder.write(buffer) und decoder.end() zur gleichen Zeit. 🎜rrreee

🎜Beispiel: Mehrere Bytes mehrmals schreiben🎜🎜🎜Das folgende Beispiel zeigt den string_decoder beim mehrmaligen Schreiben mehrerer BytesWie Module verarbeitet werden. 🎜🎜Zuerst wird efba047232e9c30493e472f2bf6fc120 übergeben. Good ist noch 1 Byte zu kurz. Zu diesem Zeitpunkt ist decoder.write(xx )gibt Sie zurück. 🎜🎜Dann rufen Sie decoder.write(Buffer.from([0xbd])) erneut auf, übergeben das verbleibende 1 Byte und geben Good erfolgreich zurück. 🎜rrreee

🎜Beispiel: Bei decoder.end() ist die Anzahl der Bytes unvollständig.🎜🎜🎜decoder.end(buffer), nur The Das erste Byte von good wird übergeben. Zu diesem Zeitpunkt wird decoder.end() aufgerufen und wird zurückgegeben bc19c5c32cd20c3c3f2e331d6251d270. 🎜rrreee🎜Das offizielle Dokument erklärt diese Situation wie folgt (fast wie Unsinn). Wenn der Codepunkt utf8 ungültig ist, ersetzen Sie ihn durch ef bf bd. 🎜🎜🎜Gibt alle im internen Puffer gespeicherten verbleibenden Eingaben als Zeichenfolge zurück. Bytes, die unvollständige UTF-8- und UTF-16-Zeichen darstellen, werden durch Ersatzzeichen ersetzt, die für die Zeichenkodierung geeignet sind.🎜🎜🎜🎜Verwandte Links🎜🎜🎜Das sollten Sie tun Merken Sie sich ein UTF-8-Zeichen „EF BF BD“ http://liudanking.com/golang/utf-8_replacement_character/🎜🎜Weitere Programmierkenntnisse finden Sie unter: 🎜Programmiervideo🎜! ! 🎜

Das obige ist der detaillierte Inhalt vonVerwenden Sie das Modul string_decoder in Nodejs, um den Puffer in einen String zu konvertieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:juejin.cn. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen