![]() |
Re: Effiziente Kompressionsverfahren
Hallo zusammen,
ich habe ein kleines Problem mit dem LZRW1/KH-Verfahren, und zwar bei der Dekompression... :( Die DecompressAny-Methode fehlt nämlich. Es wäre genial, wenn du diesselbige auch noch implementieren könntest, alzaimar! :thumb: Ach ja, eine kleine Sache noch innerhalb von CompressAny:
Delphi-Quellcode:
Du hättest doch auch
Head := @Dest^;
Delphi-Quellcode:
schreiben können, oder ist mit obigem Code das gemeint:
Head := Dest;
Delphi-Quellcode:
:?: :?:
Head := (@Dest)^;
Dank und Gruß, Marco |
Re: Effiziente Kompressionsverfahren
Zitat:
Gruss, neogen |
Re: Effiziente Kompressionsverfahren
Liste der Anhänge anzeigen (Anzahl: 2)
So nun hab ich meine obj Variante mal dazugeschenkt. Sie hat eine Stream implementation :)
Achtung: Der JCAlg dauert leider wohl beim Komprimieren von grossen Sachen lange, aber bei kleinen Sachen ist er eben auch schnell :( Beim Entpacken ist er aber schneller :) Cheers, neogen :) |
Re: Effiziente Kompressionsverfahren
Hallo neogen,
danke für deine Bemühungen :-D Kleine Meckerei zu Beginn: Bitte die Ausgabe-Version, nicht die Nebenversion inkrementieren. :roll: Danke! :mrgreen: :wink: Deine Object-Variante ist doch bedeutend schneller als das DLL-Pendant... Aber leider reicht's trotzdem nur für die hinteren Plätze. :( Schade eigentlich, bei soviel Mühe... Na, wenigstens weiß ich nun deinen echten Namen, Thorsten! :mrgreen: (Oder war ich diesmal ein wenig zu voreilig?) Danke auf jeden Fall trotzdem noch einmal für deine Mühe! :cheers: Gruß, Marco |
Re: Effiziente Kompressionsverfahren
Zitat:
Also welche Version ich erhoehen sollte war mir nicht ganz klar :) Daher bitte ich es zu verzeihen. Das mit der JCAlg1 Stream Variante ist manchmal vielleicht doch praktisch doch leider auch hier zu langsam wie ich sehe. Naja halb so wild hoffe ich. Ich bin inzwischen ein bischen schlauer als vorher :) Cheers, neogen PS: Mein Name ist definitiv nicht Thorsten ;) Da warst du ein bischen voreilig. Also nochmal raten... |
Re: Effiziente Kompressionsverfahren
Hallo neogen,
Zitat:
Zitat:
Zitat:
Zitat:
Delphi-Quellcode:
Gruß, Marco :spin2:
{
@abstract(a memorystream which will be saved compressed with JCAlg1) @author(Torsten Stelling <murphy@dev0.de>) @created(2000/10/23) @lastmod(2001/1/26) } |
Re: Effiziente Kompressionsverfahren
Moin Marco,
also meine Mama hat mich Torsten genannt und nicht Thorsten :) um es mal aufzuloesen... Ich schau mich grad um, wie ich den LZSS von 7zip eingebaut bekomme. Oder hat das schon jemand anderes versucht? Cheers, neogen |
Re: Effiziente Kompressionsverfahren
Hallo Torsten,
Zitat:
Zitat:
Gruß, Marco |
Re: Effiziente Kompressionsverfahren
Moin Marco,
Zitat:
Cheers, Torsten / neogen :D |
Re: Effiziente Kompressionsverfahren
Hallo zusammen,
danke dir, Torsten! :thumb: Trotzdem habe ich nach wie vor das Problem mit LZRW1/KH und der Dekompression... Hat da denn niemand eine Ahnung? :cry: :wink: Gruß, Marco |
Re: Effiziente Kompressionsverfahren
Ich denke den DeCompressAny sollten wir auch hinbekommen :) Schauen wir mal, was ich tun kann :) Blicke nach meinen ersten Kaffee auf den Source mal drauf...
|
Re: Effiziente Kompressionsverfahren
Hallo Torsten,
Zitat:
Gruß, Marco |
Re: Effiziente Kompressionsverfahren
Moin moin,
der Thread ist zwar schon in die Jahre gekommen, trotzdem war hier immer noch eine Frage offen (Betrifft LZRW1/KH) Die Funktion CompressAny hat nicht die korrekte Größe des komprimierten Puffers zurückgegeben, hier wurden die 2 Bytes für die Chunks unterschlagen :-) Hier mal die korrigierte Version und die noch fehlende DeCompressAny
Delphi-Quellcode:
Habe zu der LZRW1 unit aber nochmal eine Frage:
function TLZR.CompressAny(Source, Dest: BufferPtr;
SourceSize: Integer): Integer; Var Remaining, chunk : Integer; Head : ^Word; Function AddPtr (p : BufferPtr; Offset : Integer) : BufferPtr; Begin Result := BufferPtr (Integer (p) + Offset); End; begin Remaining := SourceSize; Result := 0; Repeat If Remaining < BufferMaxSize Then Begin chunk := Remaining; Remaining := 0; End Else Begin chunk := BufferMaxSize; Dec (Remaining, BufferMaxSize); End; // Pointer vom Ziel holen Head := @Dest^; // Zielpointer um SizeOf(Word) erhöhen Dest := AddPtr (Dest, 2); // Chunk komprimieren und die größe des komprimierten Chunks // ins erste Word schreiben Head^ := Compression(Source, Dest, Chunk); // Quellpointer auf den Anfang vom nächsten Chunk setzen Source := AddPtr (Source, chunk); // Zielpointer um die größe des Komprimierten Puffers erhöhen Dest := AddPtr (Dest, Head^); // und die neue größe zurückgeben Inc (Result, Head^); // und auch den Header berücksichtigen inc (Result, 2); Until Remaining = 0; end; function TLZR.DeCompressAny(Source, Dest: BufferPtr; SourceSize: Integer): Integer; Var Remaining : Integer; chunk : ^Word; NewSize : Word; Function AddPtr (p : BufferPtr; Offset : Integer) : BufferPtr; Begin Result := BufferPtr (Integer (p) + Offset); End; begin Remaining := SourceSize; Result := 0; while Remaining > 0 do begin // im ersten Word steht die größe des Chunks --> merken chunk := @Source^; // Quelle um ein Word erhöhen Source := AddPtr(Source, 2); // Dekomprimieren und größe merken NewSize := DeCompression(Source, Dest, chunk^); // Jetzt Quelle einen Chunk weiter setzen Source := AddPtr (Source, chunk^); // und den Zielpointer um die neue Größe erhöhen Dest := AddPtr (Dest, NewSize); // Jetzt die Rückgabe anpassen inc(Result, NewSize); // Größe des Headers abziehen dec(Remaining, 2); // und Größe des Chunks abziehen dec(Remaining, chunk^); end; end; Wenn ich die Überlaufprüfung {$Q} aktiviert habe, bekomme ich in der funktion GetMatch einen Fehler (Integer overflow).
Delphi-Quellcode:
Wenn ich die Überlaufprüfung abschalte funktioniert alles, komprimieren dekomprimieren etc.
//..
VAR HashValue : WORD; TmpHash : Int16; BEGIN // An dieser stelle kracht es bei {$Q} ab und zu HashValue := (40543*((((Source^[X] SHL 4) XOR Source^[X+1]) SHL 4) XOR Source^[X+2]) SHR 4) AND $0FFF; //.. Kann ich das jetzt einfach ignorieren, bzw. was bewirkt diese Überlaufprüfung überhaupt? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz