Эквивалент Ruby-пакета ('H*') в Python

Мне трудно понять, почему результаты не совпадают. Обратите внимание, что разница очень мала, если сравнить оба OUT"S. Я пытаюсь добиться того же результата в Python, что и в 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

2 ответа

Решение

Оба языка создали одинаковую последовательность байтов; единственная разница в том, как они отображают эти байты для вас. Руби имеет \e escape-последовательность строки для 1b байт (ASCII ESC, escape), в то время как Python отображает этот байт как \x1b,

Я понимаю, что этот вопрос очень старый, но у меня была точно такая же проблема, когда рубиновый «упакованный» sha1 сохранялся в поле mongodb, и попытка прочитать его с помощью функции поиска pymongo привела к чему-то, что сначала казалось нечитаемым. .

Я решил это, не используя hexlify, а просто используя двоичный файл binascii для декодера ascii (который сам по себе все еще генерирует двоичный файл длиной 28 байт), а затем используя декодирование base64 и традиционное шестнадцатеричное кодирование:

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

Я дважды проверил, что он сгенерировал правильный sha1, после этого выполнив поиск в оболочке mongo. Найти ответ было чудом, и я надеюсь, что это поможет кому-то еще прояснить тайну понятия «стая».

Отредактировано, чтобы добавить - выяснилось, что binascii может работать еще лучше с функцией b2a_hex!

      new_sha1= binascii.b2a_hex(sha1)

Итак, пока вы используете .pack('H*'), это должно работать

Другие вопросы по тегам