2015-06-08 4 views
5

Ich bin neu in Node und beginnen, einige Node-Code zu spielen. Das Problem, das ich traf, ist, wie man Pufferobjekte in NodeJS direkt vergleicht? Hier bedeutet "direkt", ohne die puffer.toString() - Methode zu verwenden oder den gesamten Puffer zu iterieren. HierWie kann man Pufferobjekte in NodeJS vergleichen?

ein Beispiel:

var buf1 = new Buffer("abc"); 
var buf2 = new Buffer("abc"); 
console.log(buf1===buf2); //result is false 
Buffer.compare(buf1,buf2);//lengthy error message 

Dank Derek

Update: Ich bin mit Version "v0.10.38", hier ist die Nachricht, wenn ich buf1.compare (buf2):

>buf1.compare(buf2) 
TypeError: Object abc has no method 'compare' 
at repl:1:7 
at REPLServer.self.eval (repl.js:110:21) 
at Interface.<anonymous> (repl.js:239:12) 
at Interface.emit (events.js:95:17) 
at Interface._onLine (readline.js:203:10) 
at Interface._line (readline.js:532:8) 
at Interface._ttyWrite (readline.js:761:14) 
at ReadStream.onkeypress (readline.js:100:10) 
at ReadStream.emit (events.js:98:17) 
at emitKey (readline.js:1096:12) 

Antwort

8

Per der nodejs change log, sieht es aus wie .compare() und .equals() wurden in Knoten v0.11 hinzugefügt .13.

Ich habe keine explizite v0.10 doc, die ich finden kann, also müssten Sie vielleicht selbst einen byteweisen Vergleich schreiben.

Hier ist eine schnelle und schmutzige Vergleichsfunktion:

function areBuffersEqual(bufA, bufB) { 
    var len = bufA.length; 
    if (len !== bufB.length) { 
     return false; 
    } 
    for (var i = 0; i < len; i++) { 
     if (bufA.readUInt8(i) !== bufB.readUInt8(i)) { 
      return false; 
     } 
    } 
    return true; 
} 

FYI, am NodeJS Quellcode suchen, die eingebauten in .compare() oder .equals() in der neueren NodeJS Version wird viel schneller sein, weil sie gehen zu C und tun memcmp() direkt auf dem Puffer, die viel schneller sein wird als zwei Methodenaufrufe für jedes Element im Puffer.


Sie können jeder dieser in Knoten v0.12.2 verwenden:

var buf1 = new Buffer("abc"); 
var buf2 = new Buffer("abc"); 
buf1.equals(buf2);   // returns true 
buf1.compare(buf2).   // returns 0 
Buffer.compare(buf1, buf2); // returns 0 

Hier weitere Einzelheiten über die einzelnen Optionen:

var buf1 = new Buffer("abc"); 
var buf2 = new Buffer("abc"); 
console.log(buf1.compare(buf2)); // 0 means buffers are the same 

Das Ergebnis 0 sein wird, wenn die zwei Puffer sind identisch, wenn nicht, nicht gleich Null.


Sie können auch verwenden:

var buf1 = new Buffer("abc"); 
var buf2 = new Buffer("abc"); 
console.log(buf1.equals(buf2)); // true means buffers are the same 

Um einen boolean zurück zu bekommen, ob die beiden Puffer die gleichen Bytes enthalten.


FYI, Ihre Original-Code von:

var buf1 = new Buffer("abc"); 
var buf2 = new Buffer("abc"); 
Buffer.compare(buf1,buf2); 

Werke für mich ganz gut. Es gibt 0 wie buf1.compare(buf2) zurück.


In Javascript die === Operator für zwei Objekte vergleicht, um zu sehen, ob die beiden Variablen auf die exakt gleiche Objekt zeigen, nicht, ob die einzelnen Objekte den gleichen Inhalt enthalten. Also, buf1 === buf1, aber buf1 !== buf2.

+0

Bitte sehen Sie sich mein Update an.Sieht bei meiner Knotenversion etwas falsch aus? – derek

+0

@derek - Es sieht so aus, als ob die Methoden '.compare() 'und' .equals() 'nach v.10 hinzugefügt wurden. Ich habe kein genaues v.10-Dokument, aber vielleicht müssten Sie nur Ihre eigene byteweise Vergleichsfunktion schreiben. – jfriend00

+0

@derek - hier ist der Änderungsprotokolleintrag [v.0.11.13] (https://nodejs.org/changelog.html#v0.11.13), der die Methoden '.compare() 'und' .equals() 'anzeigt hinzugefügt werden. – jfriend00

Verwandte Themen