base64 расшифровывает строку типа «b’Mw=='» (содержащую литеральную подстроку b’)

#python #python-3.x

#python #python-3.x

Вопрос:

Я закодировал список идентификаторов, разделенных запятыми (например, "1,2,3" ), в base64, после чего возвращаемые данные из формы выглядят как x показано ниже.

Я пробовал декодировать и кодировать всевозможные вещи, но, похоже, ничто не возвращает исходную строку.

 x = "b'Mw=='"

base64.b64decode(x)
# b'lxcc'

x.decode()
# AttributeError: 'str' object has no attribute 'decode'

y = x.encode('utf-8')
print(y)
# b"b'Mw=='"
  

Чего мне не хватает?

Комментарии:

1. base64.b64decode(b'Mw==') . Предполагается, что это должны быть байты , а не строка.

2. Удаляет двойные кавычки, т.е. x = b'Mw==' . Кроме того, b64decode не изменяет исходную строку (строки неизменяемы). Он возвращает новую строку.

3. Я не контролирую двойные цитаты, или это xy проблема. Форма, из которой я получаю данные, уже заключила байты в кавычки.

4. Кто-то вызвал str() объект bytes вместо decode() , что приводит к нарушению x . Необходимо исправить это в восходящем потоке.

5. @AndrasDeak вы правы, в конечном счете, это ошибка восходящего потока.

Ответ №1:

Если у вас есть b'...' в ваших данных, это repr() представление байтовой строки.

Если вы не можете заставить свой источник данных исправить их содержимое (это должно быть просто Mw== : то, что они вам дают, не является допустимой кодировкой base64!), вы можете использовать ast.literal_eval() для чтения ее в bytestring:

 >>> import ast, base64
>>> x = "b'Mw=='"
>>> base64.b64decode(ast.literal_eval(x))
'3'
  

Комментарии:

1. Технически это решает проблему, но моя реальная проблема заключалась в том, что восходящий поток передавал мне неправильно закодированное x . Итак, я принимаю этот ответ для тех, кто не может контролировать восходящий поток, но в моем случае я смог исправить исходник восходящего потока и декодировать мою строку, как первоначально ожидалось.