•  

ГлавнаяIndyЧастые вопросы по Indy → Как декодировать из base64?

Создано: 01.07.2014 22:52:30 · Исправлено: 01.07.2014 22:52:30 · Прочтений: 1428

IdPOP31.Retrieve(1, IdMessage1);
for j := 0 to IdMessage1.MessageParts.Count - 1 do
  if (IdMessage1.MessageParts.Items[j] is TIdAttachment) then
    s := TIdAttachment(IdMessage1.MessageParts.Items[j]).FileName;

никак не пойму, как декодировать теперь s из base64.

TIdDecoderMIME.DecodeString, также, как и самописные всякие ф-ции, не помогает, т.к. длина ы не кратна 4.
если же строку предварительно подрихтовать@? то работает нормально.

строки такие, например:
RgNCw0LnRgSDQptC40YTRgNC+0LLRi9C1INCh0LjRgdGC0LXQvNGLIDIw_=__=_utf-8_B_MTBfMTZfMTEueGxz_= (что по русски означает Прайс Цифровые Системы 2010_16_11.xls )
и
=_utf-8_B_0LrQsNC80L3QuC54bHM=_= (камни.xls)

если от второй строки отрезать =_utf-8_B_ то UTF8Decode(IdDecoderMIME1.DecodeString(0LrQsNC80L3QuC54bHM=_=)) уже показывает то, что нужно.

поискать я поискал. но не нашел.
help me энибади, плиз!
Вот ... поток нецензурной брани ... !!!!!!
глючный indy!!!!!
D2007
майнес 2 дня.
ахтунг!
Ну правильно, первым идет кодировка в которой записано имя файла, затем сам код в BASE64. Внимательней надо быть, и замечать что ты пытаешься декодировать строку с недопустимыми символами - подчеркивание(там наверно символы с кодом до 32?) не входит в алфавит BASE64, поэтому компонент и ругается. На самом деле, вместо подчеркивания в теле письма стоят спецсимволы, разграничивающие имя файла и кодировку.
А, чуть не забыл! эту строку формирует отправитель, поэтому она может быть и без указания кодировки! Для чего и нужны спецсимволы, определяющие наличие кодировки.
спасибо за внимание к вопросу.
проблема была в глючности indy.
понял это, сохранив письмо с помощью indy и сравнив потом с арегеналом.
При длине имени файла аттачмента более скольких-то там символов, оно (имя файла) просто коверкалось так, что разобрать его не было никакой возможности