[VB.net][SNIPPET] LZ77 Dekompression.

  • Hallo,
    ich veröffentliche hier aus meinem Trainer Backsprite Editor Rebirth den LZ77 Dekomprimierungscode.
    Ich habe ihn mal für euch angepasst, hoffe, dass er so funktioniert.



    System.IO muss imported werden..


    mfG hack!osa

  • Hmm imo wäre es schöner einen Stream zu übergeben und ein dynamisches Byte Array in Form einer generic List zurück zu geben, denn dann wäre man nicht an Files gebunden sondern könnte u.A. auch einen MemoryStream oder sogar(Unnötigerweiße) einen NetworkStream Dekomprimieren. Außerdem: Ich bin zwar nicht mehr ganz so gewandt in VB, aber wenn du einen Destination Buffer benutzt solltest du denke ich eine Subroutine anstelle einer Function erstellen und den Pararmeter als out oder Referenz deklarieren, schöner wäre aber mmn. immernoch ein Rückgabewert. Deine Funktion könntest du außerdem statisch machen und in eine Klasse packen.


    ~Sturmvogel


    Let the old ways live and prosper in the hearts of our young


  • Danke für das Feedback. Werd ich geich machen.
    Wollte eigentlich Ubuntu laden und installieren, aber das Inet spackt..


    EDIT: Code geupdated ;)
    Changelog:
    [+] Stream wird nun angegeben
    [+] Angabe eines Offset optional, standardmäßig 0
    [+] Größe des Arrays muss nicht vorher definiert sein
    [+] Unabhängig von Funktionen wie Dec2Bin
    [+] In einer Klasse vorhanden


    mfG hack!osa

  • Hallo,


    das ist sicher für einige brauchbar, für mich jetzt nicht, aber ich hätte noch zwei Vorschläge zum Codestil. Es wäre schön wenn du diese Dinge ändern würdest. :)


    1) In Zeile 14: 'On Error Resume Next' ist stark veraltet. In .NET nimmt man dafür eigentlich Try [...] Catch [...] End Try her. Mein Vorschlag wäre allerdings bei einem Fehler diesen Fehler auch in der Funktion durchgehen zu lassen - für den Benutzer wäre es sicher gut wenn er im Falle eines solchen weiß was schief gelaufen ist!
    2) Eher etwas unwichtiges, aber trotzdem ^^: In einer Funktion schreibt man Variablen normalerweise klein (also, hier z.B. DataLeft -> dataLeft). Das ist einfach zum Orientieren besser und allgemein so angewendet. Das ist, wie schon gesagt, nicht wichtig, wäre allerdings so ein Pluspunkt. :3


    Und noch ein paar Fehler in VS:
    - Bei 'Function' fehlt noch ein 'As Byte()', oder halt eine 'Sub'. So geht das sonst nicht!
    - Bei 'Option Strict On' in Zeile 19 und 20 gibt es noch Konvertierungsfehler, die solltest du vielleicht noch ausmerzen.


    Aber trotzdem, echt gute Arbeit. Ist sicher nützlich! :)


    lg

  • Quote


    1) In Zeile 14: 'On Error Resume Next' ist stark veraltet. In .NET nimmt man dafür eigentlich Try [...] Catch [...] End Try her. Mein Vorschlag wäre allerdings bei einem Fehler diesen Fehler auch in der Funktion durchgehen zu lassen - für den Benutzer wäre es sicher gut wenn er im Falle eines solchen weiß was schief gelaufen ist!


    Joah bin es halt noch von VB6 gewohnt. ^^


    Quote


    2) Eher etwas unwichtiges, aber trotzdem : In einer Funktion schreibt man Variablen normalerweise klein (also, hier z.B. DataLeft -> dataLeft). Das ist einfach zum Orientieren besser und allgemein so angewendet. Das ist, wie schon gesagt, nicht wichtig, wäre allerdings so ein Pluspunkt. :3


    Naja haste recht ist jetzt nicht wirklich wichtig, kann ich aber gerne anpassen!


    Quote


    Und noch ein paar Fehler in VS:
    - Bei 'Function' fehlt noch ein 'As Byte()', oder halt eine 'Sub'. So geht das sonst nicht!
    - Bei 'Option Strict On' in Zeile 19 und 20 gibt es noch Konvertierungsfehler, die solltest du vielleicht noch ausmerzen.


    Die beiden Sachen kann ich nicht verstehen, da der Code bei mir so einwandfrei läuft.


    Quote


    Aber trotzdem, echt gute Arbeit. Ist sicher nützlich!


    Danke!


    Lg hack!osa

  • Hey,


    sorry, I do not happen to have a compression algorithm, since I never had the need for one. Though going from the decompression routine it shouldn't be too hard to create one. My general (though untested) approach would be to process the data to compress from begin to end and at each position look if the data at the current cursor also exists in the compression window (the area that can be addressed with an reference at that position). Then just place either a reference or the actual data in the compressed buffer!


    Kind Regards,
    hack!osa

  • Oh ok....


    I was able to create a decompression function in vb which accepted string and gave back string... (the need of string I/O came upto my head due to my readhex and writehex function which gave result as string)
    But i had simply made "byte array" <--> "string" conversion function as well.


    Now as you said I was also thinking of the same thing... but this really bored to get it dont today ;)
    I will try it out some other day as I am also not in a urgent need of it :)


    Thanks for the reply.


    Kind Regards,
    The_Learner!