Für das Listaller-Projekt brauche ich unbedingt die Möglichkeit, mittels dem LZMA-SDK Dateien zu komprimieren. (Das schreiben die neuen IPK-Spezifikationen vor, die ich nicht schon wieder kippen will)
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 Dekomprimierung gelistet ist:
Code: Alles auswählen
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;
Dummerweise verstehe ich den Dekompressionsalgorithmus nicht (der Code ist auch leider nicht dokumentiert). Auf jeden Fall erreicht er folgende Bedingung (weshalb er abbricht) (ungefähr Z. 382):
Code: Alles auswählen
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, inklusive einer kompletten Neuübersetzung einzelner Teile des SDK direkt aus dem Java/C-Code, gebracht hat's nichts.
Hat jemand eine Idee?
Übrigens: Es existiert hierzu ein Thema auf Delphipraxis, das aber noch ohne Antworten ist. (dort kennen nur wenige das LZMA-SDK)