Heim  >  Artikel  >  Web-Frontend  >  So verwenden Sie Buffer zum Kodieren und Dekodieren von Binärdaten in Node.js

So verwenden Sie Buffer zum Kodieren und Dekodieren von Binärdaten in Node.js

不言
不言Original
2018-06-30 16:08:042561Durchsuche

In diesem Artikel wird hauptsächlich die Verwendung von Buffer zum Codieren und Decodieren von Binärdaten in Node.js vorgestellt. Buffer unterstützt ASCII, UTF8, UCS2, Base64 und andere Codierungsformate.

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.

Puffer erstellen

Sie können einen Puffer mit einer UTF-8-Zeichenfolge erstellen, etwa so:

var buf = new Buffer(‘Hello World!');

Sie können auch eine Zeichenfolge mit a verwenden angegebene Kodierung Puffer erstellen:

var buf = new Buffer('8b76fde713ce', 'base64');

Akzeptable Zeichenkodierungen und Bezeichner sind wie folgt:

1.ascii – ASCII, 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 Codierung basiert auf 64 druckbaren ASCII-Zeichen zur Darstellung von Binärdaten. Base64 wird normalerweise zum Einbetten von Binärdaten in Zeichendokumente verwendet, die in Zeichenfolgen konvertiert werden können, und kann bei Bedarf verlustfrei konvertiert werden Zurück zum ursprünglichen Binärformat.

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字节的缓冲

Pufferdaten abrufen und festlegen

Erstellen Oder nachdem Sie ein Pufferobjekt 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:

var buf = new Buffer('my buffer content');
// 访问缓冲内第10个字节
console.log(buf[10]); // -> 99

Hinweis: Wenn Sie (die Pufferkapazität verwenden Beachten Sie beim Erstellen eines initialisierten Puffers unbedingt, dass die gepufferten Daten nicht auf 0, sondern auf Zufallsdaten initialisiert werden.

var buf = new Buffer(1024);
console.log(buf[100]); // -> 5 (某个随机值)

Sie können die Daten an jeder Position im Puffer wie folgt ändern:

buf[99] = 125; // 把第100个字节的值设置为125

Hinweis: In einigen Fällen erzeugen einige Puffervorgänge keine Fehler, wie zum Beispiel:

1. Der maximale Wert der Bytes im Puffer beträgt 255. Wenn einem Byte eine Zahl größer als 256 zugewiesen wird, ist es Modulo 256, und dann wird das Ergebnis 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 die Länge des Puffers mithilfe des Längenattributs ermitteln:

var buf = new Buffer(100);
console.log(buf.length); // -> 100

Sie können die Pufferlänge auch verwenden, um den Inhalt des Puffers zu durchlaufen, um jedes Byte zu lesen oder festzulegen:

var buf = new Buffer(100);
for(var i = 0; i < buf.length; i++) {
    buf[i] = i;
}

Der obige Code erstellt einen neuen Puffer mit 100 Bytes und setzt jedes Byte im Puffer von 0 auf 99.

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:

var buffer = new Buffer("this is the content of my buffer");
var smallerBuffer = buffer.slice(8, 19);
console.log(smallerBuffer.toString()); // -> "the content"

Beachten Sie, dass beim Teilen eines Puffers kein neuer Speicher zugewiesen oder kopiert wird. Der neue Puffer verwendet den Speicher des übergeordneten Puffers Puffer. Puffert einen Verweis auf ein Datenelement (angegeben durch die Startposition). Diese Passage enthält mehrere Bedeutungen.

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 verwenden, um den Slice-Vorgang zu ersetzen.

Pufferdaten kopieren

你可以像这样用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 = &#39;my string&#39;;
var buf = new Buffer(utf8String);
var base64String = buf.toString(&#39;base64&#39;)

小结

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

nodejs中实现路由功能的方法

NodeJs基本语法和类型的介绍

深入解析node.js的exports、module.exports与ES6的export、export default

Das obige ist der detaillierte Inhalt vonSo verwenden Sie Buffer zum Kodieren und Dekodieren von Binärdaten in Node.js. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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