Ruby pack('H *')在Python中的等价物

vof42yt1  于 2023-08-04  发布在  Ruby
关注(0)|答案(2)|浏览(124)

我很难弄清楚为什么输出不一样。请注意,如果比较两个OUT,差异非常小。我试图实现的是在Python中获得与Ruby相同的输出。

Ruby:

IN:['034151a3ec46b5670a682b0a63394f863587d1bc97483b1b6c70eb58e7f0aed192'].pack('H*')
OUT:\x03AQ\xA3\xECF\xB5g\nh+\nc9O\x865\x87\xD1\xBC\x97H;\elp\xEBX\xE7\xF0\xAE\xD1\x92

Python:

IN:unhexlify('034151a3ec46b5670a682b0a63394f863587d1bc97483b1b6c70eb58e7f0aed192')OUT:\x03AQ\xa3\xecF\xb5g\nh+\nc9O\x865\x87\xd1\xbc\x97H;\x1blp\xebX\xe7\xf0\xae\xd1\x92

0lvr5msh

0lvr5msh1#

两种语言都产生了相同的字节序列;唯一的区别是它们向您显示这些字节的方式。Ruby对1b字节有一个\e字符串转义序列(ASCII ESC,转义),而Python将该字节显示为\x1b

fhity93d

fhity93d2#

我知道这个问题很老了,但是我遇到了同样的问题,一个ruby 'packed'艾德sha1被存储到mongodb字段中,试图使用pymongo find函数读取它,产生了一些最初看起来不可读的东西。
我没有使用hexlify解决它,而是使用binascii二进制到ascii解码器(它本身仍然生成一个28字节长的二进制),然后使用base64解码和传统的hexing:

new_sha1= base64.b64decode(binascii.b2a_base64(agg_sha1, newline=False)).hex()

字符串
之后我通过在mongo shell中搜索,仔细检查了它是否生成了正确的sha1。找到答案是一个奇迹,我希望这有助于其他人揭开“包”的神秘面纱。

  • 编辑添加 * -发现binascii可以用b2a_hex函数做得更好!
new_sha1= binascii.b2a_hex(sha1)


所以只要你使用的是.pack('H *'),这就可以了

相关问题