Эквивалент 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*'), это должно работать