Расшифровка URL-адреса Base64 с использованием Python2 против Python3 - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь выполнить декодирование URL-адреса base64 в шестнадцатеричной строке. Однако я не могу правильно декодировать строку, используя Python3.

Шестнадцатеричная строка - 614756736247395862334a735a41, а эквивалент ASCII - «aGVsbG9Xb3JsZA». Декодированная строка должна быть helloWorld.

Мой код:

str_encoded = "614756736247395862334a735a41"
byte_encoded = binascii.unhexlify(str_encoded)
print(base64.urlsafe_b64decode(str(byte_encoded) + '=' * (4 - len(str(byte_encoded)))))
print(base64.urlsafe_b64decode("aGVsbG9Xb3JsZA=="))

Если я запустил вышеуказанное с помощью Python2, я получу правильную декодированную строку helloWorld. Но если я запустил с Python3, первый print дал неверный результат.

Почему есть разница и какую альтернативу binascii.unhexlify() мне следует использовать в Python3?

1 Ответ

0 голосов
/ 09 июля 2020

Разница в том, что unhexlify() в python2 возвращает объект str, а python 3 - bytes, потому что python2 не имеет такого класса. Когда вы запускаете функцию str() для байтового объекта в Python 3, вы получаете только repr() для этого объекта, поэтому str(byte_encoded) в Python 3 возвращает b"........", если вы хотите, чтобы он работал в обеих версиях Я рекомендую вам превратить str(byte_encoded) в просто byte_encoded и декодировать переменную byte_encoded, если это Python3, так будет так:

str_encoded = "614756736247395862334a735a41"
byte_encoded = binascii.unhexlify(str_encoded)
try:
    byte_encoded = byte_encoded.decode()
except:
    pass
print(base64.urlsafe_b64decode(byte_encoded + '=' * (4 - len(str(byte_encoded)))))
print(base64.urlsafe_b64decode("aGVsbG9Xb3JsZA=="))
...