2011-02-07 1 views
-1

Может кто-нибудь дать совет о том, как декодировать эти строки? Это части предметов электронной почты.python: декодировать строки

=?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 
+0

Напишите свой код в удобочитаемом виде и включите любой полученный результат или ошибки. –

+0

Откуда берутся эти строки? Какую информацию вы пытаетесь извлечь из них? – Sapph

+0

'' =? ICLRLcvu5Obo8fLo6iI? = '. Decode (' base-64 '). Decode (' windows-1251 ') 'does work ... –

ответ

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) 
+0

Вы правы, но не понимаете, почему необходимо добавить == к концу :(может быть, что-то не так с этими строками ... –

+2

base64 работает путем перегруппировки битов, он превращает 3 8-битных символа в 4 6-битных (затем заполняет пустые верхние биты 0s). Чтобы отменить это, он ожидает 4 символа за раз - длина вашей строки должна быть кратна 4 символам. Символы '=' распознаются как заполнение, три символа достаточно заполнить любую строку, состоящую из четырех символов. –

+0

О, мой «С-Лоджистик» Фролова Марина Витальевна Фролова Марина Витальевна !!!!! –

2

Кажется, что эти строки были неправильно закодированы, без заполнения в конце. Строка base64 должна всегда содержать несколько символов. Обивка символ =, то вы можете добавить его вручную, если длина не кратно 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 «=» , соответственно.

+0

Вы правы, спасибо :) –

Смежные вопросы