如何比较NodeJS中的缓冲区对象?

我是Node新手,开始播放一些节点代码。 我遇到的问题是如何直接比较NodeJS中的Buffer对象? 这里“直接”意味着不使用buffer.toString()方法或迭代整个缓冲区。

这里是一个例子:

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

感谢Derek

更新:我正在使用版本“v0.10.38”,这里是消息,如果我使用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) 

       

网上收集的解决方案 "如何比较NodeJS中的缓冲区对象?"

根据nodejs更改日志 ,它看起来像节点v0.11.13中添加了.compare().equals()

我没有明确的v0.10 doc,我可以find,所以也许你必须自己写一个字节的字节比较。

这是一个快速和肮脏的比较function:

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

仅供参考,在查看nodejs源代码时,更新的nodejs版本中的内置.compare().equals()会快很多,因为它们转到C并直接​​在正在执行的缓冲区上执行memcmp()要比缓冲区中每个项目的两个方法调用快得多。


您可以在节点v0.12.2中使用其中的任何一种:

 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 

以下是每个选项的更多细节:

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

如果两个缓冲区不相等,则结果将为0


你也可以使用:

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

为了得到两个缓冲区是否包含相同字节的布尔值。


仅供参考,您的原始代码为:

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

为我工作得很好。 它就像buf1.compare(buf2)一样返回0


在Javascript中,两个对象的===运算符进行比较,以查看两个variables是否指向完全相同的对象,而不是单独的对象是否包含相同的内容。 所以, buf1 === buf1 ,但是buf1 !== buf2