编辑:
我的文件有几行。我将文件加密到一个新文件。我想将每行解密文件(=一个流)存储到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;
答案 0 :(得分:0)
从流中加载需要TStream
,因此您可以为TFileStream
和TMemoryStream
提供一个bbuffer.Position := 0;
。您发布的代码应该没有任何问题。究竟什么不起作用?
您可能必须使用
TStringList.SaveToStream
将位置重置为流的开头,然后将其加载到字符串列表中。
编辑:您将单个字节写入流,然后尝试从中加载字符串列表。那不行。流只是一个字节集合。字符串列表应该如何知道一个字符串的结束位置和下一个字符串的开始位{{1}}将分隔符字节写入流,以便它可以解析字符串列表。因此,您可以对字符串列表进行加密,然后将整个字符串列表写入流中,然后读取字符串列表并在字符串列表上进行解密。