2015-06-08 19 views
5

Düğümde yeniyim ve bazı düğüm kodlarını çalmaya başladım. Karşılaştığım sorun, doğrudan NodeJS'deki Buffer nesnelerini karşılaştırmaktır? Burada "doğrudan", buffer.toString() yöntemini kullanmadan demektir veya tüm arabelleği yineleyin. derekNodeJS'de arabellek nesneleri nasıl karşılaştırılır?

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

Teşekkür

Güncelleme: İşte

bir örnektir Ben "v0.10.38" versiyonunu kullanıyorum , burada buf1.compare (buf2) kullanırsanız mesajdır: nodejs change log Başına

>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) 

cevap

8

, bu .compare() ve .equals() gibi düğüm v0.11 eklendi görünüyor 0,13.

Bulduğum açık bir v0.10 belgesine sahip değilim, bu yüzden belki de bayt karşılaştırması yaparak bir bayt yazmanız gerekir.

Burada hızlı ve kirli karşılaştırma fonksiyonu var: onlar gittiğiniz için nodejs kaynak koduna bakılarak içinde,

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; 
} 

Bilginize, yerleşik .compare() veya .equals() yeni nodejs sürümünde çok daha hızlı olacak C ve tamponda her öğe için iki yöntemden daha çok daha hızlı olacak olan tampon üzerinde doğrudan memcmp() yapın.


Sen düğüm v0.12.2 bunlardan herhangi birini kullanabilirsiniz:

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

sonuç 0 olacaktır:

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 

İşte her seçenek hakkında daha ayrıntılı bilgiyi değilse iki tampon sıfırdan aynıdır.


da kullanabilirsiniz:

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

geri iki tamponlar aynı bayt içerip içermediğine ilişkin bir boolean almak için.


Bilginize, yeniden başlangıçtaki kodu: Benim için

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

İşleri gayet.buf1.compare(buf2) gibi döner.


JavaScript içinde iki nesne için === Operatör iki değişkenin ayrı nesne aynı içeriğe sahip olup olmadığını, aynı nesneyi işaret olmadığını görmek için karşılaştırır. Yani buf1 === buf1, ancak buf1 !== buf2.

+0

lütfen güncellemeye bir göz atın.Düğüm sürümümde yanlış bir şey mi görünüyor? – derek

+0

@derek - v .10'dan sonra '.compare()' ve '.equals()' yöntemlerine eklendi. Tam bir v.10 belgesine sahip değilim, ama belki de bayt karşılaştırma işleviyle kendi baytınızı yazmanız yeterlidir. – jfriend00

+0

@derek - işte burada [.09.13 değişiklik kaydı girişi] (https://nodejs.org/changelog.html#v0.11.13) '.compare() 've' .equals() 'yöntemlerini gösterir. ekleniyor. – jfriend00

İlgili konular