如何比较NodeJS中的Buffer对象?

时间:2015-06-08 04:23:12

标签: node.js

我是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

由于 德里克

更新: 我正在使用版本“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)

1 个答案:

答案 0 :(得分:18)

根据nodejs change log,在节点v0.11.13中添加了.compare().equals()

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

这是一个快速而肮脏的比较功能:

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

对我来说效果很好。它会像0一样返回buf1.compare(buf2)

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