【发布时间】:2015-05-21 02:19:57
【问题描述】:
我在 delphi-zip 库的 this 线程链接中找到了 LZMA 的实现。但我无法从中正确使用解压。 有人可以用这个库为我写一个小解压样本吗?
这是我的代码,它适用于压缩,但不适用于解压缩并返回 0 大小
使用 System.Zip.LZMA;
....
procedure TForm2.CompressProgress(Sender: TObject; const aPosition, aSize, aCompressedSize: UInt64);
begin
end;
procedure TForm2.DecompressProgress(Sender: TObject; const aPosition, aSize: UInt64);
begin
end;
procedure TForm2.CompressButton1Click(Sender: TObject);
var LZI: TLZMAEncoderStream; OutStream, InStream: TMemoryStream;
begin
OutStream:= TMemoryStream.Create;
LZI := TLZMAEncoderStream.Create(OutStream, CompressProgress);
InStream:= TMemoryStream.Create;
InStream.LoadFromFile('1.exe');
InStream.Position := 0;
LZI.Write(InStream, InStream.Size);
OutStream.Position := 0;
OutStream.SaveToFile('1.exe.lzma');
InStream.Free;
OutStream.Free;
LZI.Free;
end;
procedure TForm2.DecompressButton2Click(Sender: TObject);
var Deca: TLZMADecoderStream; Str1: TMemoryStream; S2 : TBytesStream; J, I: Cardinal;
begin
I := 0;
Str1 := TMemoryStream.Create;
Str1.LoadFromFile('1.exe.lzma');
Str1.Position := 0;
Deca:= TLZMADecoderStream.Create(Str1, DecompressProgress);
S2 := TBytesStream.Create;
J := Deca.Read(S2.Bytes, 0, i);
Caption := IntToStr(J);
S2.Position := 0;
S2.SaveToFile('1.exe');
Deca.Free;
Str1.Free;
S2.Free;
end;
我也试过这样做,但还是不行
procedure TForm2.Button2Click(Sender: TObject);
var Deca: TLZMADecoderStream; Str1 : TMemoryStream; S2:TBytesStream; J, I: Cardinal;
begin
I := 0;
Str1 := TMemoryStream.Create;
Str1.LoadFromFile('1.exe.lzma');
Str1.Position := 0;
Deca:= TLZMADecoderStream.Create(Str1, DeProgress);
S2 := TBytesStream.Create;
Deca.Position := 0;
J := Deca.Read(S2.Bytes, 0, Deca.Size);
Caption := IntToStr(J);
S2.Position := 0;
S2.SaveToFile('Dec0.exe');
Deca.Free;
Str1.Free;
S2.Free;
end;
【问题讨论】:
-
你从 decomp 流中读取了 0 个字节,你期望会发生什么?!
-
J := Deca.Read(S2.Bytes, 0, i);。您初始化了I := 0;,从未更改它,因此从流中读取零字节。你得到了你想要的,AFAICT。 -
所以我猜你需要运行一个循环读取块,直到 Read 返回 0。你也做了很多 Delphi 程序员所做的事情,并且觉得不得不不惜一切代价使用内存流。你在读一个文件?使用 TFileStream。不要先将其全部读入内存。解压时为什么要读入字节流,然后保存到文件中。直接读入以写模式打开的文件流。流是一个抽象层。
-
也许你可以提供一个样本请求)
-
我确定您可以将 I 设置为非零值。