Я нашел в this нить ссылки библиотеки delphi-zip, которая имеет реализацию LZMA. Но я не могу правильно использовать Декомпрессию. Может ли кто-нибудь написать небольшой образец декомпрессии для меня, используя эту библиотеку?Delphi 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;
Вы читаете 0 байт из потока decomp, что вы ожидали? –
'J: = Deca.Read (S2.Bytes, 0, i);'. Вы инициализировали 'I: = 0;', никогда не меняли его и поэтому читали нулевые байты из потока. У вас есть именно то, что вы просили, AFAICT. –
Итак, я думаю, вам нужно запустить куски для чтения цикла, пока Read не вернет 0. Вы также выполняете то, что делают многие программисты Delphi и вынуждены использовать потоки памяти любой ценой. Вы читаете файл? Используйте TFileStream. Не читайте сначала все в памяти. При распаковке, почему вы читаете в поток байтов, а затем сохраняете в файл. Прочтите непосредственно в поток файлов, который открывается в режиме записи. Потоки - это уровень абстракции. –