TStringList загрузить поток памяти?<Delphi> - PullRequest
0 голосов
/ 16 декабря 2010

отредактировано:

В моем файле несколько строк. Я зашифровал файл на новый файл. Я хочу сохранить каждую строку расшифрованного файла (= поток) в StringList.

Во-первых, у меня есть файл, содержащий:

aa
bb
cc

Я шифрую файл с помощью этой функции:

procedure EnDecryptFile(pathin, pathout: string; Chave: Word) ;
 var
   InMS, OutMS: TMemoryStream;
   cnt: Integer;
   C: byte;
 begin
   InMS := TMemoryStream.Create;
   OutMS := TMemoryStream.Create;
   try
     InMS.LoadFromFile(pathin) ;
     InMS.Position := 0;
     for cnt := 0 to InMS.Size - 1 do
       begin
         InMS.Read(C, 1) ;
         C := (C xor not (ord(chave shr cnt))) ;
         OutMS.Write(C, 1) ;
       end;
     OutMS.SaveToFile(pathout) ;
   finally
     InMS.Free;
     OutMS.Free;
   end;
 end;

Теперь моя цель - сохранить исходное значение каждой строки в StringList. Я не хочу хранить расшифрованный файл на жестком диске, поэтому я использую поток.

Это функция для расшифровки файла в поток:

procedure DecryptFile(pathin: string; buff: TMemoryStream; Chave: Word);
var
  InMS: TMemoryStream;
  cnt: Integer;
  C: byte;
begin
  InMS := TMemoryStream.Create;
  try
    InMS.LoadFromFile(pathin);
    InMS.Position := 0;
    for cnt := 0 to InMS.Size - 1 do
    begin
      InMS.Read(C, 1);
      C := (C xor not(ord(Chave shr cnt)));
      buff.Write(C, 1);
    end;
    // buff.SaveToFile('c:\temp\dump.txt') ;
  finally
    InMS.free;
  end;
end;

-

 bbuffer := TMemoryStream.Create;
    try
      DecryptFile(path, bbuffer, 10); //  
      //ShowMessage(IntToStr(bbuffer.size)); // output : 1000
      bbuffer.Position := 0;
      SL := TStringList.Create; 
      try
        SL.LoadFromStream(bbuffer);
        for I := 0 to SL.Count - 1 do // SL.Count = 1
        begin;
        //add each line of orginal file into SL??
        end;
      finally
        SL.free;
      end;
    finally
      bbuffer.free;
    end;

1 Ответ

0 голосов
/ 16 декабря 2010

Загрузка из потока занимает TStream, поэтому вы можете присвоить ей TFileStream, а также TMemoryStream. Код, который вы разместили, должен работать без проблем. Что именно не работает?

Возможно, вам придется использовать

bbuffer.Position := 0;

для сброса позиции в начало потока перед загрузкой его в список строк.

РЕДАКТИРОВАНИЕ: Вы записываете отдельные байты в поток, а затем пытаетесь загрузить из него список строк. Это не сработает. Поток - это просто набор байтов. Как список строк должен знать, где заканчивается одна строка и начинается следующая? TStringList.SaveToStream записывает разделительные байты в поток, чтобы он мог проанализировать список строк обратно. Таким образом, вы можете выполнить шифрование в списке строк, а затем записать весь список строк в поток, затем прочитать список строк и выполнить дешифрование в списке строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...