我很难弄清楚为什么输出不一样。请注意,如果比较两个OUT
,差异非常小。我试图实现的是Python中的输出与Ruby中的输出相同。
Ruby:
IN:['034151a3ec46b5670a682b0a63394f863587d1bc97483b1b6c70eb58e7f0aed192'].pack('H*')
OUT:x03AQxA3xECFxB5gnh+nc9Ox865x87xD1xBCx97H;elpxEBXxE7xF0xAExD1x92
Python:
IN:unhexlify('034151a3ec46b5670a682b0a63394f863587d1bc97483b1b6c70eb58e7f0aed192')
OUT:x03AQxa3xecFxb5gnh+nc9Ox865x87xd1xbcx97H;x1blpxebXxe7xf0xaexd1x92
两种语言都产生了相同的字节序列;唯一的区别在于它们向您显示这些字节的方式。Ruby为1b
字节提供了一个e
字符串转义序列(ASCII ESC,转义(,而Python则将该字节显示为x1b
。
我知道这个问题已经很老了,但我遇到了完全相同的问题,一个ruby"pack"的sha1被存储到mongodb字段中,试图使用pymongo find函数读取它时,一开始似乎无法读取。
我不是用hexlify解决的,而是用binascii二进制到ascii解码器(它本身仍然生成28字节长的二进制(,然后用base64解码和传统的和星:
new_sha1= base64.b64decode(binascii.b2a_base64(agg_sha1, newline=False)).hex()
之后,我在mongo shell中搜索,再次检查它是否生成了正确的sha1。找到答案是一个奇迹,我希望这能帮助其他人解开"包装"的神秘面纱。
编辑添加-发现binascii可以用b2a_hex函数做得更好!
new_sha1= binascii.b2a_hex(sha1)
所以,只要你使用.back('H*'(,这应该可以