TStringList加载内存流? <德尔福> </德尔福>

时间:2010-12-16 07:14:07

标签: delphi stream

编辑:

我的文件有几行。我将文件加密到一个新文件。我想将每行解密文件(=一个流)存储到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 :(得分:0)

从流中加载需要TStream,因此您可以为TFileStreamTMemoryStream提供一个bbuffer.Position := 0; 。您发布的代码应该没有任何问题。究竟什么不起作用?

您可能必须使用

TStringList.SaveToStream

将位置重置为流的开头,然后将其加载到字符串列表中。

编辑:您将单个字节写入流,然后尝试从中加载字符串列表。那不行。流只是一个字节集合。字符串列表应该如何知道一个字符串的结束位置和下一个字符串的开始位{{1}}将分隔符字节写入流,以便它可以解析字符串列表。因此,您可以对字符串列表进行加密,然后将整个字符串列表写入流中,然后读取字符串列表并在字符串列表上进行解密。