我期待new Buffer(buffer.toString())
总是逐字节相等。但是,我遇到的情况并非如此。
首先,确实如此:
var buf1 = new Buffer(32);
for (var i = 0 ; i < 32 ; i++) {
buf1[i] = i;
}
console.log(buf1);
console.log(new Buffer(buf1.toString()));
<Buffer 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f>
<Buffer 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f>
然而,这是一个不存在的情况:
var buf2 = crypto.createHmac('sha256', 'key')
.update('string')
.digest();
console.log(buf2);
console.log(new Buffer(buf2.toString()));
<Buffer 97 d1 5b ea ba 06 0d 07 38 ec 75 9e a3 18 65 17 8a b8 bb 78 1b 2d 21 07 64 4b a8 81 f3 99 d8 d6>
<Buffer ef bf bd ef bf bd 5b ef bf bd ef bf bd 06 0d 07 38 ef bf bd 75 ef bf bd ef bf bd 18 65 17 ef bf bd ef bf bd ef bf bd 78 1b 2d 21 07 64 4b ef bf bd ef ... >
buf2
使new Buffer(buf2.toString())
与buf2
的字节不相等有什么不同?
答案 0 :(得分:3)
就JS而言,Buffer
是一个对象,因此您需要比较对象引用。由于两个缓冲区实际上并不是同一个实例,因此这种等式检查(==
或===
)永远不会成立。
为了比较缓冲区内容,如果您有节点v0.12或更新版本,则可以使用buffer.equals(buffer2)
之类的内容。对于较旧的节点版本,您必须使用循环来逐字节检查。
补充说明:
调用.toString()
将二进制数据转换为UTF-8。如果该数据中存在无效的UTF-8字符,则这些字符通常将替换为\uFFFD
的替换字符。发生此替换时,内容现在不同,导致equals()
返回false
。实际上,您可以在第二个缓冲区(ef bf bd
的实例)中看到这一点。