简短概述
你的节点代码尝试解析哈希结果为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'
在Node中:
<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中,字符串只是char(0-255)值的数组。然而,在Node中,该值存储为缓冲区(Buffer),实际上表示了一个值(0-255)的数组。 这就是关键的不同之处。 Node不返回字符串,因为Node中的字符串不是单字节字符的数组,而是UTF-16代码单元的数组。 Python使用
u''
指定的单独字符串类来支持Unicode。
所以比较您打印输出的示例,为了便于阅读进行了简化。
print '\xbax\x16\xbf\x8f\x01\xcf\xeaAA'
vs
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'
vs
process.stdout.write(
new Buffer([0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea, 0x41, 0x41]))
在这种情况下,
process.stdout.write
是一种将二进制值写入终端的方式,而不是字符串。但实际上,你应该将哈希值作为十六进制进行比较,因为它已经是一个二进制值的字符串表示形式,而且比错误解码的Unicode字符更容易阅读。
hashDigest
是一个Buffer
,所以你的示例输出肯定不正确。对于Python,如果你实际上打印出hash_digest
的字节,你会得到什么?在我的测试中,当运行此代码时,两者都会得到相同的二进制内容。 - loganfsmyth