base64 в шестнадцатеричную строку - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь сделать шестнадцатеричную строку из строки base64. Исходная строка: M0SvYeRHPWDYVIG/giptBFqBMQdWObq8br1RDqWfO1rvky6RW0HiGCMQC1mhybYzFeSUkC5iw464P5nCYUc== Она должна стать:

3344af61e4473d60d85481bf822a6d04 5a8131075639babc6ebd510ea59f3b5a ef932e915b41e21823100b59a1c9b633 15e494902e62c38eb83f99c26147 

Мой код:

str1 = "M0SvYeRHPWDYVIG/giptBFqBMQdWObq8br1RDqWfO1rvky6RW0HiGCMQC1mhybYzFeSUkC5iw464P5nCYUc=="
d = base64.b64decode(str1)
d1 = d.decode('utf-8')
print(d1)

Однако я получаю сообщение в расшифровке utf-8:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xaf in position 2: invalid start byte

Результат d1:

b'3D\xafa\xe4G=`\xd8T\x81\xbf\x82*m\x04Z\x811\x07V9\xba\xbcn\xbdQ\x0e\xa5\x9f;Z\xef\x93.\x91[A\xe2\x18#\x10\x0bY\xa1\xc9\xb63\x15\xe4\x94\x90.b\xc3\x8e\xb8?\x99\xc2aG'

Где моя ошибка? Я также хотел бы увидеть обратную версию от шестнадцатеричной строки до base64. Я использую python 3 .

1 Ответ

1 голос
/ 30 мая 2020

Результат base64.b64decode(str1):

  • a bytes объект уже в Python 3.
  • a str object in Python 2 (и str и bytes здесь синонимы).

Следующий сценарий с комментариями охватывает обе версии Python:

import base64
str1 = "M0SvYeRHPWDYVIG/giptBFqBMQdWObq8br1RDqWfO1rvky6RW0HiGCMQC1mhybYzFeSUkC5iw464P5nCYUc=="
d = base64.b64decode(str1)
print(type(d))
print(type(d) is bytes)

# python 2
if type(d) is str:
    d = bytearray(d)

# The old format style was the %-syntax:
d1=''.join(['%02x'%i for i in d])
print(d1)

# The more modern approach is the .format method:
d1=''.join(['{:02x}'.format(i) for i in d])
print(d1)

Результат :

py -3 .\SO3\62087693.py
<class 'bytes'>
True
3344af61e4473d60d85481bf822a6d045a8131075639babc6ebd510ea59f3b5aef932e915b41e21823100b59a1c9b63315e494902e62c38eb83f99c26147
3344af61e4473d60d85481bf822a6d045a8131075639babc6ebd510ea59f3b5aef932e915b41e21823100b59a1c9b63315e494902e62c38eb83f99c26147
py -2 .\SO3\62087693.py
<type 'str'>
True
3344af61e4473d60d85481bf822a6d045a8131075639babc6ebd510ea59f3b5aef932e915b41e21823100b59a1c9b63315e494902e62c38eb83f99c26147
3344af61e4473d60d85481bf822a6d045a8131075639babc6ebd510ea59f3b5aef932e915b41e21823100b59a1c9b63315e494902e62c38eb83f99c26147

Примечание: в последнее время, начиная с Python 3.6 и выше есть f-string синтаксис (но я завис в версии 3.5.1, поэтому это не доказано пример):

''.join([f'{i:02x}' for i in d])
...