Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Запись дешифрованого файла в переменную


Автор: chiffa 9.5.2011, 22:06
Всем добрый день. Есть код, который дешифрует файл и результат в файл:

Код

procedure TFrmShow.DEcrypt(KeyStr:string; infile: string; outfile:string);
  var
    Cipher: TDCP_3des;
    Source, Dest: TFileStream;
    Res: TStream;
  begin
    begin
      try
        Source:= TFileStream.Create(infile, fmOpenRead);
        Dest:= TFileStream.Create(ExtractFilePath(Application.ExeName) + '\' +  outfile, fmCreate);
        Cipher:= TDCP_3des.Create(Self);
        Cipher.InitStr(KeyStr,TDCP_sha256);              
        Cipher.DecryptStream(Source, Dest, Source.Size); 
        Cipher.Burn;
        Cipher.Free;
        Dest.Free;
        Source.Free;
        MessageDlg('File decrypted',mtInformation,[mbOK],0);
      except
        MessageDlg('File IO error',mtError,[mbOK],0);
      end;
    end;
  end;



все работает на ура, вопрос в том как записать поток в файл и уже дальше сразу отображать результат на экран, минуя запись и опять чтения... Заранее благодарен за помощь!

Автор: MetalFan 9.5.2011, 23:49
Цитата(chiffa @  9.5.2011,  22:06 Найти цитируемый пост)
дальше сразу отображать результат на экран, минуя запись и опять чтения

хм, а зачем для отображения на экран записывать и опять считывать???

Автор: chiffa 10.5.2011, 00:15
а как правильнее?...

Автор: bems 10.5.2011, 00:20
Писать в какой-нить другой поток. TMemoryStream подойдет

Автор: chiffa 10.5.2011, 00:29
а как писать?... примером не поможешь?...

Автор: bems 10.5.2011, 00:40
Так же как в примере, который ты привел, но не понимаешь. Dest нужно переделать из TFileStream в TMemoryStream

Автор: chiffa 10.5.2011, 01:18
Код

procedure TFrmShow.DEcrypt(KeyStr:string; infile: string; outfile:string);
  var
    Cipher: TDCP_3des;
    Source: TFileStream;
    Dest: TMemoryStream;
  begin
    begin
      try
        Source:= TFileStream.Create(infile, fmOpenRead);
        Dest:= TMemoryStream.Create;
        Cipher:= TDCP_3des.Create(Self);
        Cipher.InitStr(KeyStr,TDCP_sha256);              // initialize the cipher with a hash of the passphrase
        Cipher.DecryptStream(Source, Dest, Source.Size); // decrypt the contents of the file
        Memo1.Lines.LoadFromStream(Dest);
        Cipher.Burn;
        Cipher.Free;
        Dest.Free;
        Source.Free;
        MessageDlg('File decrypted',mtInformation,[mbOK],0);
      except
        MessageDlg('File IO error',mtError,[mbOK],0);
      end;
    end;
  end;


В Memo1 почему то ничего не вставляет...

Автор: bems 10.5.2011, 02:19
во-первых перед загрузкой в мемо сделай потоку Position := 0
во-вторых шифрованный текст может содержать нулевые символы, на которых мемо может обрезать содержимое при выводе на экран

Автор: chiffa 10.5.2011, 09:34
Дешифруется файл pdf так что думаю хоть что то да должно выводить...

Прописал Dest.Position:=0;

Выводятся в мемо, но буквально одна строка... как я понимаю далеко не весь файл...

Автор: MetalFan 10.5.2011, 11:09
chiffa, сказали же, что возможно в данных присутствует #0
Открой любым hex-редактором расшифрованный файл, посмотри.

Автор: jhonyxakep 10.5.2011, 14:18
Цитата(MetalFan @  10.5.2011,  11:09 Найти цитируемый пост)
chiffa, сказали же, что возможно в данных присутствует #0Открой любым hex-редактором расшифрованный файл, посмотри.


либо length

Автор: chiffa 10.5.2011, 16:59
Length (Dest)?...

Автор: Snowy 10.5.2011, 17:22
Цитата(jhonyxakep @  10.5.2011,  14:18 Найти цитируемый пост)
либо length
Либо скунс...

- Петька, приборы
- 134
- Что 134???
- А что "Приборы"?

Цитата(chiffa @  10.5.2011,  16:59 Найти цитируемый пост)
Length (Dest)?...
Тогда уж Dest.Size

А в чём собственно вопрос?
Файл в Dest. Что ещё нужно?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)