Назначение '"sss" .decode ("base64"). decode ("zlib")' - PullRequest
1 голос
/ 10 января 2010
ACTIVATE_THIS = """
eJx1UsGOnDAMvecrIlYriDRlKvU20h5aaY+teuilGo1QALO4CwlKAjP8fe1QGGalRoLEefbzs+Mk
Sb7NcvRo3iTcoGqwgyy06As+HWSNVciKaBTFywYoJWc7yit2ndBVwEkHkIzKCV0YdQdmkvShs6YH
E3IhfjFaaSNLoHxQy2sLJrL0ow98JQmEG/rAYn7OobVGogngBgf0P0hjgwgt7HOUaI5DdBVJkggR
3HwSktaqWcCtgiHIH7qHV+esW2CnkRJ+9R5cQGsikkWEV/J7leVGs9TV4TvcO5QOOrTHYI+xeCjY
JR/m9GPDHv2oSZunUokS2A/WBelnvx6tF6LUJO2FjjlH5zU6Q+Kz/9m69LxvSZVSwiOlGnT1rt/A
77j+WDQZ8x9k2mFJetOle88+lc8sJJ/AeerI+fTlQigTfVqJUiXoKaaC3AqmI+KOnivjMLbvBVFU
1JDruuadNGcPmkgiBTnQXUGUDd6IK9JEQ9yPdM96xZP8bieeMRqTuqbxIbbey2DjVUNzRs1rosFS
TsLAdS/0fBGNdTGKhuqD7mUmsFlgGjN2eSj1tM3GnjfXwwCmzjhMbR4rLZXXk+Z/6Hp7Pn2+kJ49
jfgLHgI4Jg==
""".decode("base64").decode("zlib")

мой код:

import zlib
print 'dsss'.decode('base64').decode('zlib')#error

Traceback (most recent call last):
  File "D:\zjm_code\b.py", line 4, in <module>
    print 'dsss'.decode('base64').decode('zlib')
  File "D:\Python25\lib\encodings\zlib_codec.py", line 43, in zlib_decode
    output = zlib.decompress(input)
zlib.error: Error -3 while decompressing data: unknown compression method

a='dsss'.encode('zlib')
print a
a.encode('base64')
print a
a.decode('base64')#error
print a
a.decode('zlib')
print a

x\x9cK)..Traceback (most recent call last):
  File "D:\zjm_code\b.py", line 7, in <module>
    a.decode('base64')
  File "D:\Python25\lib\encodings\base64_codec.py", line 42, in base64_decode
    output = base64.decodestring(input)
  File "D:\Python25\lib\base64.py", line 321, in decodestring
    return binascii.a2b_base64(s)
binascii.Error: Incorrect padding

a='dsss'
a=a.encode('zlib')
print a
a=a.decode('zlib')
print a#why can't print 'dsss'

x\x9cK)..

a='dsss'
a=a.encode('zlib')
#print a
a=a.decode('zlib')
print a#its ok

Я думаю, что 'print a' кодирует a с 'uhf-8'. так:

#encoding:utf-8
a='dsss'
a=a.encode('zlib')
print a
a=a.decode('utf-8')#but error.
a=a.decode('zlib')
print a#


x\x9cK)..Traceback (most recent call last):
  File "D:\zjm_code\b.py", line 5, in <module>
    a=a.decode('utf-8')
  File "D:\Python25\lib\encodings\utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0x9c in position 1: unexpected code byte

Ответы [ 4 ]

4 голосов
/ 10 января 2010

Данные в строках кодируются и сжимаются двоичными данными. .decode("base64").decode("zlib") кодирует и распаковывает его.

Вы получили ошибку, потому что 'dsss', декодированный из base64, недопустим для сжатых данных zlib.

3 голосов
/ 10 января 2010

Какова цель x.decode(”base64”).decode(”zlib”) for x in ("sss", "dsss", random_garbage)? Извините, вы должны знать; Вы тот, кто делает это!

Редактировать после добавления OP различных головоломок

Головоломка 1

a='dsss'.encode('zlib')
print a
a.encode('base64')
print a
a.decode('base64')#error
print a
a.decode('zlib')
print a

Разрешение: все 3 утверждения вида

a.XXcode('encoding')

должно быть

a = a.XXcode('encoding')

Головоломка 2

a='dsss'
a=a.encode('zlib')
print a
a=a.decode('zlib')
print a#why can't print 'dsss'

x\x9cK)..

Но это делает печатать 'dsss':

>>> a='dsss'
>>> a=a.encode('zlib')
>>> print a
x£K)..♠ ♦F☺¥
>>> a=a.decode('zlib')
>>> print a#why can't print 'dsss'
dsss
>>>

Головоломка 3

"" "Я думаю, что" print a "кодирует a с помощью" uhf-8 "." ""

Разрешение: Вы думаете крайне неправильно. То, что следует за print, является выражением . Там нет таких побочных эффектов. Как вы думаете, что происходит, когда вы делаете это:

print 'start text ' + a + 'end text'

Как вы думаете, что произойдет, если вы сделаете print a дважды? Кодировать уже закодированный текст снова? Почему бы тебе не перестать воображать и попробовать это?

В любом случае, обратите внимание, что вывод str.encode ('zlib') является объектом str, а не объектом Unicode:

>>> print repr('dsss'.encode('zlib'))
'x\x9cK)..\x06\x00\x04F\x01\xbe'

Переход от этого к UTF-8 будет несколько трудным ... сначала его нужно будет декодировать в юникод - с каким кодеком? ascii и utf8 будут иметь проблемы с '\ x9c' и '\ xbe' ...

1 голос
/ 10 января 2010

Это обратная сторона:

original_message.encode('zlib').encode('base64')

zlib - это алгоритм двоичного сжатия. base64 - это текстовая кодировка двоичных данных, которая полезна для отправки двоичного сообщения через текстовые протоколы, такие как SMTP.

После того, как 'dsss' был декодирован из base64 (три байта 76h, CBh, 2Ch), результатом были недопустимые сжатые данные zlib, поэтому их нельзя было декодировать.

Попробуйте напечатать ACTIVATE_THIS, чтобы увидеть результат декодирования. Оказывается, это какой-то код Python.

1 голос
/ 10 января 2010

.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 делает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...