node.js - 为什么 `buffer` 和 `new Buffer(buffer.toString())` 并不总是逐字节相等?

标签 node.js

我期望 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 字节不等价?

最佳答案

Buffer 就 JS 而言是一个对象,因此您正在比较对象引用。由于两个 Buffer 实际上不是同一个实例,因此这种相等性检查(=====)永远不会成立。

为了比较缓冲区内容,如果您有 Node v0.12 或更高版本,则可以使用类似 buffer.equals(buffer2) 的内容。对于较旧的 Node 版本,您必须使用循环来逐字节检查。

附加说明:

调用.toString() 将二进制数据转换为UTF-8。如果该数据中存在无效的 UTF-8 字符,这些字符通常会被 \uFFFD 的替换字符替换。发生此替换时,内容现在不同,导致 equals() 返回 false。事实上,您可以在第二个缓冲区(ef bf bd 的实例)中看到这一点。

关于node.js - 为什么 `buffer` 和 `new Buffer(buffer.toString())` 并不总是逐字节相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34048889/

相关文章:

node.js - 没有名称的 Node JS 对象

node.js - Windows-Build-Tools无法下载python

node.js - 如何在Docker中使用永远的CLI?

javascript - node.js、heroku 中的错误状态 413 是什么意思?

javascript - LoopBack访问另一个模型

javascript - 使用特定路径和命名空间连接到 Socket.IO 服务器

node.js - 使用 Node SDK 从镜像创建 Azure VM

javascript - socket.io 在连接时未从服务器向客户端发出事件

javascript - 如何在 Node.js 中的主进程和子进程之间传递流输入/输出

javascript - 如何在另一个函数中模拟一个函数nodejs