python:解码字符串

时间:2011-02-07 16:10:06

标签: python base64 decode

有人可以就如何解码这些字符串提出建议吗? 它们是电子邮件主题的一部分。

=?Windows-1251?B?ICLRLcvu5Obo8fLo6iI?=

=?koi8-r?B?5tLPzM/XwSDtwdLJzsEg98nUwczYxdfOwQ?=

=?Windows-1251?B?1PDu6+7i4CDM4PDo7eAgwujy4Ov85eLt4A?=

可能需要获取字符串ICLRLcvu5Obo8fLo6iI的内部部分然后base64.decodestring(string).decode('windows-1251') 这种方法在大多数情况下都适用,但不适用于这些字符串:(

base64.decodestring('ICLRLcvu5Obo8fLo6iI')
---------------------------------------------------------------------------
Error                                     Traceback (most recent call last)

/home/alecs/<ipython console> in <module>()

/usr/lib/python2.6/base64.pyc in decodestring(s)
    319 def decodestring(s):
    320     """Decode a string."""
--> 321     return binascii.a2b_base64(s)
    322 
    323 

Error: Incorrect padding

2 个答案:

答案 0 :(得分:4)

test = [
    '=?Windows-1251?B?ICLRLcvu5Obo8fLo6iI?=',
    '=?koi8-r?B?5tLPzM/XwSDtwdLJzsEg98nUwczYxdfOwQ?=',
    '=?Windows-1251?B?1PDu6+7i4CDM4PDo7eAgwujy4Ov85eLt4A?='
]

def decodeStr(s):
    s = s.split('?')
    enc = s[1]
    dat = s[3]

    return (dat+'===').decode('base-64').decode(enc)

for t in test:
    print decodeStr(t)

答案 1 :(得分:2)

似乎这些字符串编码错误,最后没有填充。 base64字符串应始终具有4个字符的倍数。填充字符是=,如果长度不是4的倍数,您可以手动添加它。以下是您的示例的结果:

>>> print "ICLRLcvu5Obo8fLo6iI=".decode ('base-64').decode ('Windows-1251')
 "С-Лоджистик"
>>> print "5tLPzM/XwSDtwdLJzsEg98nUwczYxdfOwQ==".decode ('base-64').decode ('koi8-r')
Фролова Марина Витальевна
>>> print "1PDu6+7i4CDM4PDo7eAgwujy4Ov85eLt4A==".decode ('base-64').decode ('Windows-1251')
Фролова Марина Витальевна

注意分别添加1,2和2'='符号。