Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на Delphi и Lazarus


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Орловский Дмитрий
Статус: Академик
Рейтинг: 4408
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2648
∙ повысить рейтинг »
cradlea
Статус: Практикант
Рейтинг: 1486
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Delphi и Lazarus

Номер выпуска:1590
Дата выхода:08.04.2011, 12:30
Администратор рассылки:Киселёва Алёна aka Verena (Профессор)
Подписчиков / экспертов:253 / 181
Вопросов / ответов:1 / 1

Вопрос № 182694: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: кодирую бинарные данные с помощью base64 (компонент TIdEncoderMIME) и результат декодирую, но он оказывается порченным - не соответствует оригиналу. вот код:


Вопрос № 182694:

Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:

кодирую бинарные данные с помощью base64 (компонент TIdEncoderMIME) и результат декодирую, но он оказывается порченным - не соответствует оригиналу. вот код:

Код:
var
Buf: ^TBytes;
s:string;
...
AssignFile(xls, 'data.xls');
Reset(xls, 1);
xls_size:= FileSize(xls);
buf := AllocMem(xls_size);
BlockRead(xls, Buf^, xls_size, readed); // считываю весь двоичный файл в buf
s:= IdEncoderMIME1.EncodeBytes(tbytes(buf)); // кодирую
s:= IdDecoderMIME1.DecodeString(s)// тут же декодирую и на выходе получаю порченные данные - не совпадают с исходным файлом 'data.xls';


EncodeBytes() требует параметр с типом TBytes, но у меня динамический массив TBytes, поэтому передал параметром tbytes(buf). так же попробовал сделать так:
Код:
Response.Content:= IdEncoderMIME1.EncodeBytes(buf^);

выкинуло ошибку: Access violation at address 0040950C in module
и без ^ не компилится:
Код:
Response.Content:= IdEncoderMIME1.EncodeBytes(buf);

Отправлен: 02.04.2011, 12:13
Вопрос задал: Maksim Trofimov (6-й класс)
Всего ответов: 1
Страница вопроса »


Отвечает sir Henry (Старший модератор) :
Здравствуйте, Maksim Trofimov!

Поскольку у Вас версия Delphi 2010, то и Indy у Вас должна быть версии 10 и в ней есть более удобный способ работы с кодированием\декодированием файлов, чем это было ранее. Вот пример:
Код:
//Кодирование
procedure TForm1.Button1Click(Sender: TObject);
Var
s1, s2: TFileStream;
begin
if od1.Execute then
Begin
s1:=TFileStream.Create(od1.FileName, fmOpenRead);
s2:=TFileStream.Create(od1.FileName+'.mime', fmCreate);
en1.Encode(s1, s2);
s1.Free;
s2.Free;
End;
end;

//Декодирование
procedure TForm1.Button2Click(Sender: TObject);
Var
s1, s2: TFileStream;
begin
if od1.Execute then
Begin
s1:=TFileStream.Create(od1.FileName, fmOpenReadWrite);
s2:=TFileStream.Create(Copy(od1.FileName, 1, Length(od1.FileName)-5), fmCreate);
de1.DecodeBegin(s2);
de1.Decode(s1);
de1.DecodeEnd;
s1.Free;
s2.Free;
End;

end;

В этом примере en1 - это компонент типа TIdEncoderMIME, а de1 - компонент типа TIdDecoderMIME. od1 - это компонент-диалог открытия файла, с помощью него задаётся тот файл, который надо закодировать\раскодировать.
-----
Я только в одном глубоко убеждён - не надо иметь убеждений! :)

Ответ отправил: sir Henry (Старший модератор)
Ответ отправлен: 06.04.2011, 07:55
Номер ответа: 266577
Россия, Красноярск

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 266577 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.



    В избранное