Entwickler-Ecke

Algorithmen, Optimierung und Assembler - LZW Dekomprimierung


Mr_Sven - Mo 12.02.07 17:19
Titel: LZW Dekomprimierung
Hi Leute,

habe ein Problem mit dem Dekomprimieren von UnixCompressed Files.

Ich habe die unlzw Funktion von gzip 1.24 von C nach Pascal portiert.
Es funktionier soweit alles, nur das er bei größeren Dateien probleme bekommt.

Vieleicht könnt ihr euch das mal anschauen, ich denke ich habe irgent ein Fehler bei der Portierung gemacht.

ZIP File:
comp.Z - Komptimiertes File
uncomp_tobe - Unkomprimiertes File wie es gZip entpackt
uncomp - Unkomprimiertes File wie es die Unit entpackt
lzwUnit.pas - LZW Unit
lzw.c - gZip LZW Code
lzw.h - gZip LZW Header
unlzw.c - gZip unLZW Code


Delete - Mo 12.02.07 17:28

sag mal, weshalb compilierst dir das C file nicht gleich in delphi? oder bindest das compilat dann anschliessend als Obj file in eine Unit ein?

dann würdest dir doch die ganze arbeit ersparen, von den möglichen fehlerquellen mal abgesehen.


Mr_Sven - Mo 12.02.07 17:31

naja, wenns funktioniert.

haste nen Tut irgentwo?

Gruß Sven


Delete - Mo 12.02.07 17:47

kompilieren kannste es ja mit jeden handelsüblichen C compiler oder eben mit delphi2006 ab SP1, hier kannste das auch einbinden und mischen.

ansonsten gehts einfach per direktive
{$L DeinObjFile.OBJ}

und der deklaration der funktionen als external;
bspw: procedure moveword(var sourc, dest;count: integer); external;

'n C compiler gibts hier: Suche bei Google DOWNLOAD TURBO C oder bei borland/codegear zum kostenlosen download. <HTH>


Mr_Sven - Di 13.02.07 10:39

So, hab den fehler gefunden, (Happy)
nun funktionierts.

Habe das Unit noch mit nen Kommentar versehen, falls jemand mal drüber stolpert, könnt ihr gerne verwenden.

Gruß Sven


Chryzler - Di 13.02.07 16:43

user profile iconMr_Sven hat folgendes geschrieben:
So, hab den fehler gefunden, (Happy)
nun funktionierts.

Habe das Unit noch mit nen Kommentar versehen, falls jemand mal drüber stolpert, könnt ihr gerne verwenden.

Gruß Sven

Das Teil kann ich sogar sehr gut gebrauchen. Thx!


Chryzler - Di 13.02.07 16:58

Ich mir gerade daraus eine DLL gebastelt, die die zwei Funktionen exportiert. Vielleicht kann es ja jemand gebrauchen. :)


BenBE - Mi 14.02.07 15:30

Dein Goto zu ResetBuf kannst Du auch mit dem Befehl Continue realisieren, der immer auf den nächsten Schleifendurchlauf springt (zusätzlich aber auch die Abbruchbedingung neu prüft).

Ansonsten würde mich auch die Portierung der LZW Compress-Funktionen für ein Projekt interessieren.

BTW: Hatte nicht Windows auch eine LZW.dll???


Chryzler - Mi 14.02.07 15:54

user profile iconBenBE hat folgendes geschrieben:
BTW: Hatte nicht Windows auch eine LZW.dll???

Ich dachte auch, ich hätte schon mal was von einer LZW.dll gehört. :gruebel: Bei mir ist jedenfalls keine da. :nixweiss:


Mr_Sven - Di 20.02.07 15:57

user profile iconBenBE hat folgendes geschrieben:
Dein Goto zu ResetBuf kannst Du auch mit dem Befehl Continue realisieren, der immer auf den nächsten Schleifendurchlauf springt (zusätzlich aber auch die Abbruchbedingung neu prüft).

Kann sein, habe dies nicht so genau überprüft.
Ausserdem sind das zwei verschachtelte schleifen und ich weis nicht inwiefern sich die Abbruchbedingung verändert, habe das halt blanco übernommen.
Ich denke die werden sich schon was dabei gedacht haben.
user profile iconBenBE hat folgendes geschrieben:

Ansonsten würde mich auch die Portierung der LZW Compress-Funktionen für ein Projekt interessieren.

Das habe ich auch überlegt, nur das Problem ist hierbei, dass der Komprimierungsalgorithmus (watn langes Wort) Patentiert ist und man Lizensgebühren zahlen muss.
Siehe: http://de.wikipedia.org/wiki/Lempel-Ziv-Welch-Algorithmus

Ich wollt mir hier keine Geldstrafe einhandeln.


BenBE - Di 20.02.07 19:37

user profile iconMr_Sven hat folgendes geschrieben:
user profile iconBenBE hat folgendes geschrieben:

Ansonsten würde mich auch die Portierung der LZW Compress-Funktionen für ein Projekt interessieren.

Das habe ich auch überlegt, nur das Problem ist hierbei, dass der Komprimierungsalgorithmus (watn langes Wort) Patentiert ist und man Lizensgebühren zahlen muss.
Siehe: http://de.wikipedia.org/wiki/Lempel-Ziv-Welch-Algorithmus

Ich wollt mir hier keine Geldstrafe einhandeln.

Soweit ich das unter http://de.wikipedia.org/wiki/Lempel-Ziv-Welch-Algorithmus#Patente sehe, ist das betreffende Patent 2004 ausgelaufen. Für die anderen beiden erwähnten Patente, sieht das genauso aus (wenn man von den 20 Jahren ausgeht). IANAL.


Mr_Sven - Do 22.02.07 12:53

Du könntest recht haben.
Hat vieleicht irgentjemand nen C Programm oder sowas was LZW Komprimieren kann.
Mittlerweite kann ich ja ganz gut C Programme nach Pascal portieren.

Gruß Sven


BenBE - Sa 24.02.07 16:17

Eine kurze Suche bei Google ergab folgenden Link:
http://datacompression.info/LZW.shtml
HTH.
Dort hast Du eine kleine Linksammlung, wo auch zu den Patenten noch ein wenig was steht. Source findest Du ganz unten auf der Page.

//Edit: Könnte auch helfen: http://www.codeproject.com/cpp/LZWCompression.asp