Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Effiziente Kompressionsverfahren (https://www.delphipraxis.net/46674-effiziente-kompressionsverfahren.html)

Marphy 29. Jun 2005 18:15

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:
Head := @Dest^;
Du hättest doch auch
Delphi-Quellcode:
Head := Dest;
schreiben können, oder ist mit obigem Code das gemeint:
Delphi-Quellcode:
Head := (@Dest)^;
:?: :?:

Dank und Gruß, Marco

neogen 30. Jun 2005 15:23

Re: Effiziente Kompressionsverfahren
 
Zitat:

Zitat von Marphy
@neogen: Du bist jetzt besonders angesprochen :tongue: Schnell ist der JCALG1 eben nicht. Mach ich was falsch?!

Moin, ich spiel grad mit dem Projekt rum. Es wirft interressante Fakten auf :| Ich dachte immer der ist recht fix, da leider meine Daten immer alle um max. 100kb waren, faellt es nicht weiter auf bei speichern und laden von Daten. Ich werde noch ein bischen testen. Das Kompressionsverfahren ist am schnellsten mit einem Fenster von 4096 Byte.

Gruss, neogen

neogen 30. Jun 2005 16:14

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 :)

Marphy 30. Jun 2005 16:38

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

neogen 30. Jun 2005 16:51

Re: Effiziente Kompressionsverfahren
 
Zitat:

Zitat von Marphy
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:

Moin Marco,

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...

Marphy 30. Jun 2005 17:19

Re: Effiziente Kompressionsverfahren
 
Hallo neogen,

Zitat:

Zitat von neogen
Also welche Version ich erhoehen sollte war mir nicht ganz klar :) Daher bitte ich es zu verzeihen.

Hey, kein Problem... :wink: Ich bin froh, dass du mir die Meckerei nicht übel genommen hast. :stupid:

Zitat:

Zitat von neogen
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.

Mensch, du brauchst dich doch nicht dauernd zu rechtfertigen/entschuldigen. Ich bin über jeden Algo froh, der den Kompressionsvergleich bereichert! :)

Zitat:

Zitat von neogen
Ich bin inzwischen ein bischen schlauer als vorher :)

Freut mich!

Zitat:

Zitat von neogen
PS: Mein Name ist definitiv nicht Thorsten ;) Da warst du ein bischen voreilig. Also nochmal raten...

Hab ich's mir doch gleich gedacht... :???: Hmm, also entweder bist du so bescheiden und fälschst deinen Namen absichtlich oder die pas-Files sind nich von dir :mrgreen:
Delphi-Quellcode:
{
 @abstract(a memorystream which will be saved compressed with JCAlg1)
 @author(Torsten Stelling <murphy@dev0.de>)
 @created(2000/10/23)
 @lastmod(2001/1/26)
}
Gruß, Marco :spin2:

neogen 1. Jul 2005 08:48

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

Marphy 1. Jul 2005 14:34

Re: Effiziente Kompressionsverfahren
 
Hallo Torsten,

Zitat:

Zitat von neogen
also meine Mama hat mich Torsten genannt und nicht Thorsten :) um es mal aufzuloesen...

Scherzkeks :wink:

Zitat:

Zitat von neogen
Ich schau mich grad um, wie ich den LZSS von 7zip eingebaut bekomme. Oder hat das schon jemand anderes versucht?

Ja, ich! :mrgreen: Das Problem ist, dass der 7Zip-Code nur in C(++) vorliegt. Und der gute Herr Russell hat diesen für Inno Setup augenscheinlich "nur" in eine DLL gesteckt... :gruebel: Aber zugegeben, ich habe mir das Ganze nicht so intensiv vorgeknöpft, daher weiß ich auch nicht viel mehr. :stupid:

Gruß, Marco

neogen 3. Jul 2005 21:06

Re: Effiziente Kompressionsverfahren
 
Moin Marco,

Zitat:

Zitat von Marphy
Hallo Torsten,
Ja, ich! :mrgreen: Das Problem ist, dass der 7Zip-Code nur in C(++) vorliegt. Und der gute Herr Russell hat diesen für Inno Setup augenscheinlich "nur" in eine DLL gesteckt... :gruebel: Aber zugegeben, ich habe mir das Ganze nicht so intensiv vorgeknöpft, daher weiß ich auch nicht viel mehr. :stupid:

Naja das mit dem C++ sollte ja nicht das Problem sein, es gibt doch den Commandozeilencompiler von Borland und Microsoft sogar kostenlos. :) Alternativ probiert man vielleicht einen anderen oder baut einen Wrapper um die 7-ZIP DLL, die das packen dann macht, leider bekommt man dann aber .7z Dateien, was fuer einfache Streams wohl nicht das gewuenschte ist. Ich werde mal schauen, dass ich morgen oder uebermorgen ein paar Versuche mit dem compilieren von den C++ Code mache. Weiteres werde ich dann mal melden.

Cheers, Torsten / neogen :D

Marphy 4. Jul 2005 16:13

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

neogen 5. Jul 2005 08:47

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...

Marphy 7. Jul 2005 18:35

Re: Effiziente Kompressionsverfahren
 
Hallo Torsten,

Zitat:

Zitat von neogen
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...

*rot-werd* :oops: Super, vielen Dank! :thumb: Aber bitte beeile dich nicht, ich komm wohl vor Montag nicht mehr dazu... :wink:

Gruß, Marco

x000x 19. Feb 2006 16:31

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:
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;
Habe zu der LZRW1 unit aber nochmal eine Frage:
Wenn ich die Überlaufprüfung {$Q} aktiviert habe, bekomme ich in der funktion
GetMatch einen Fehler (Integer overflow).
Delphi-Quellcode:
//..
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;
//..
Wenn ich die Überlaufprüfung abschalte funktioniert alles, komprimieren dekomprimieren etc.
Kann ich das jetzt einfach ignorieren, bzw. was bewirkt diese Überlaufprüfung überhaupt?


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:04 Uhr.
Seite 2 von 2     12   

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