Hallo!
Für ein Projekt brauche ich unbedingt die Möglichkeit, mittels dem LZMA-
SDK Dateien zu komprimieren.
Also habe ich mir das
SDK von
hier heruntergeladen. Das Packen der Dateien funktioniert hervorragend, nur das entpacken nicht...
Ich benutze folgenden Code, der auch als Beispiel für die komprimierung gelistet ist:
Delphi-Quellcode:
procedure Decompress(infile:
String;outfile:
String);
var
outdir :
string;
var
dictionary:integer;
inStream:TBufferedFS;
outStream:TBufferedFS;
filesize:int64;
i:integer;
properties:
array[0..4]
of byte;
decoder:TLZMADecoder;
outSize:int64;
v:byte;
const propertiessize=5;
begin
inStream:=TBufferedFS.Create(infile,fmOpenRead
or fmsharedenynone);
outStream:=TBufferedFS.Create(outfile, fmcreate);
if inStream.
read(properties, propertiesSize) <> propertiesSize
then
raise Exception.Create('
input .lzma file is too short');
decoder := TLZMADecoder.Create;
if not decoder.SetDecoderProperties(properties)
then
raise Exception.Create('
Incorrect stream properties');
outSize := 0;
for i := 0
to 7
do begin
v :=
{shortint}(ReadByte(inStream));
if v < 0
then
raise Exception.Create('
Can''
t read stream size');
outSize := outSize
or v
shl (8 * i);
end;
if not decoder.Code(inStream, outStream, outSize)
then
raise Exception.Create('
Error in data stream');
decoder.Free;
outStream.Free;
inStream.Free;
end;
Input ist ein XZ-Komprimiertes TAR archiv, welches von anderen Anwendugen problemlos geöffnet werden kann.
Dummerweise verstehe ich den Dekompressionsalgorithmus nicht (der Code ist
überhaupt nicht dokumentiert). Auf jeden Fall erreicht er folgende Bedingung (weshalb er abbricht) (ungefähr Z. 382):
Delphi-Quellcode:
if (rep0 >= nowPos64) or (rep0 >= m_DictionarySizeCheck) then begin
m_OutWindow.Flush();
result:=false;
exit;
end;
(in der Datei ULZMADecoder.pas)
Wie bekomme ich das zum Laufen? Ich habe schon alles mögliche probiert, aber der Fehler muss in diesem Algorithmus liegen.
Hat jemand eine Idee?