.decode('base64')
может быть вызван только для строки, которая закодирована как «base-64», чтобы извлечь последовательность байтов, которая была там закодирована. Предположительно, эта последовательность байтов в приведенном вами примере была сжата zlib, и поэтому .decode('zlib')
часть распаковывает его.
Теперь для вашего случая:
>>> 'dsss'.decode('base64')
'v\xcb,'
Но 'v\xcv,'
не является строкой, сжатой zlib! И поэтому, конечно, вы не можете попросить zlib «распаковать» его. К счастью, zlib
распознает тот факт (что 'v\xcv,'
не мог быть получен путем применения какого-либо из алгоритмов сжатия, zlib
знает о любом входном сигнале) и поэтому выдает полезное сообщение об ошибке (вместо случайного вывода) строка байтов, которую вы вполне могли бы получить, если бы вы случайно указали другую, но одинаково сумасшедшую входную строку! -)
Редактировать : ошибка в
a.encode('base64')
print a
a.decode('base64')#error
очевидно из-за того, что строки неизменны : просто вызов a.encode
(или любого другого метода) делает не alter a
, он создает новый строковый объект (а здесь вы просто печатаете его).
В следующем фрагменте ошибка только в уме ОП:
>>> a='dsss'
>>> a=a.encode('zlib')
>>> print a
x?K)..F?
>>> a=a.decode('zlib')
>>> print a#why can't print 'dsss'
dsss
>>>
вопрос «почему не может печатать» действительно своеобразен, он применяется к коду, который печатает для печати «dsss». Наконец,
я думаю, что 'print a' кодирует a
с 'uhf-8'.
Вы ошибаетесь: нет такого понятия, как "uhf-8" (вы имеете в виду "utf-8", может быть?), И в любом случае print a
не делает не изменяет a
, больше, чем просто звонит a.encode
делает.