TL;博士
您的节点代码正在尝试将哈希结果解析为 utf8 并失败。
不同之处在于语言如何处理其二进制数据和字符串类型。在考虑最终的二进制输出时,您的示例都输出相同的值。因此,让我们以十六进制格式举例说明您的两个示例的输出:
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
在 Python 中:
'\xbax\x16\xbf\x8f\x01\xcf\xeaAA@\xde]\xae"#\xb0\x03a\xa3\x96\x17z\x9c\xb4\x10\xffa\xf2\x00\x15\xad'
在节点中:
<SlowBuffer ba 78 16 bf 8f 01 cf ea 41 41 40 de 5d ae 22 23 b0 03 61 a3 96 17 7a 9c b4 10 ff 61 f2 00 15 ad>
在这种情况下,需要注意的核心是 Python 中的结果以字符串形式返回。在 Python 中,字符串只是字符 (0-255) 值的数组。然而,Node 中的值存储为一个 Buffer,它实际上也表示一个值数组 (0-255)。这是这里不同的关键。Node 不返回字符串,因为 Node 中的字符串不是单字节字符的数组,而是 UTF-16 代码单元的数组。Python 使用由u''
.
因此,然后比较您打印输出的示例,缩短了可读性
print '\xbax\x16\xbf\x8f\x01\xcf\xeaAA'
对比
console.log('' +
new Buffer([0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea, 0x41, 0x41]))
Python 代码说,将这个字节数组写入终端。然而,第二个说的是非常不同的东西,将这个字节数组转换为一个字符串,然后将该字符串写入终端。但是缓冲区是二进制数据,不是 UTF-8 编码的数据,所以它会无法将你的数据解码成字符串,导致结果乱码。如果您希望直接将二进制值与终端中的实际解码值进行比较,则需要提供两种语言的等效指令。
print '\xbax\x16\xbf\x8f\x01\xcf\xeaAA'
对比
process.stdout.write(
new Buffer([0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea, 0x41, 0x41]))
process.stdout.write
在这种情况下,这是一种将二进制值写入终端而不是字符串的方法。
但实际上,您应该将哈希值与十六进制进行比较,因为它已经是二进制值的字符串表示形式,并且比解码不正确的 unicode 字符更容易阅读。