sss".decode("base64").decode("zlib")' 的目的是什么?

1 投票
4 回答
3884 浏览
提问于 2025-04-15 17:51
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'是用'utf-8'格式来编码变量a的。

所以:

#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 个回答

1

.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(或者其他任何方法)并不会改变 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' 是用 'uhf-8' 编码了 a。

你想错了:根本没有“uhf-8”这种东西(你可能是想说“utf-8”?),而且无论如何 print a不会改变 a,就像仅仅调用 a.encode 一样。

3

这个代码 x.decode(”base64”).decode(”zlib”) for x in ("sss", "dsss", random_garbage) 是干什么的呢?抱歉,你应该知道,因为这是你在做的事情!

编辑:在提问者添加了各种难题后

难题 1

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

解决方案:所有形式为

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' 是用 'uhf-8' 编码 a 的。"""

解决方案:你想得太离谱了。紧接着 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 会有点困难……它必须先解码成 unicode——用什么编码呢?asciiutf8 会对 '\x9c' 和 '\xbe' 感到困扰……

4

这些字符串里的数据是经过编码和压缩的二进制数据。.decode("base64").decode("zlib") 这个过程是用来解码和解压缩这些数据的。

你遇到的错误是因为从 base64 解码出来的 'dsss' 不是有效的 zlib 压缩数据。

撰写回答