TomT - Mo 30.06.03 21:16
Prinzipiell läuft das über die Häufigkeit einzelner Werte innerhalb einer Datei. Die werden dann so kodiert, dass den einzelnen Werten eine Folge aus einsen entspricht die mit 0 abgeschlossen werden. Der häufigste Wert erhält dabei die wenigsten einsen. Wenn du also z.B folgende Zeichenkette hast:
Entspricht
A: 0
B: 10
C: 110
Ergibt: 0000 1010 1100. So werden aus 8 byte 1,5. Das ist wohl nur ein einfaches Beispiel.
tommie-lie - Mo 30.06.03 22:24
Wer sucht der findet...
Huffman-Kompression Teil I [
http://www.delphi-forum.de/viewtopic.php?t=10536]
Huffman-Kompression Teil II [
http://www.delphi-forum.de/viewtopic.php?t=10537]
Zwar nicht besonders gut erklärt, aber immerhin.
Ansonsten nach Lempel-Ziv(-Welch) oder Huffman im Internet suchen. Beide sind zwar nicht selbst ZIP im Original, aber unter
http://www.wotsit.org kann man sich die Header zum ZIP-Format anschauen und das Komprimierungsprinzip ist das gleiche wie LZ (bzw. LZW, übrigens der Algo vom GIF-Format) und Huffman. Die einen ein wenig mehr verfeinert, die anderen weniger.
Und im c't-Archiv auf heise.de findest du auch noch was, wenn du bereit bist ein wenig Geld zu investieren, denn da war vor höchstens einem halben Jahr ein guter KnowHow-Artikel über Lempel-Ziv-Komprimierung.
Was TomT gepostet hat ist nur die halbe Wahrheit ;-)
Zusätzlich wird nämlich noch ein Dictionary angelegt, das die zugehörigen Bit-Werte speichert. Durch die Größe des Dictionaries kann man bei großen, unregelmäßigen Dateien schon einiges an zusätzliche Kompressionsrate erzielen. Aber das ist alles nachzulesen im c't-Artikel.
Edit:
Weil nach nach Kompression allgemein gefragt hast:
Verlustbehaftete Komprimierungsverfahren, wie z.B. Ogg Vorbis, MPeg oder JPeg basieren zusätzlich zu oben genannten Verfahren der Wörterbücher auf ergonomischen Modellen. Bei Audiodaten sind das psychoakustische Hörmodelle, die genau besagen, welche Frequenzen der Durchschnittsmensch am besten hört, und was er wann nicht hört, weil ein anderer Ton das Ganze übertönt. Bei Bildern sind das Farbnuancen, die vom Auge nicht mehr getrennt wahrgenommen werden können, bzw Detailstufen, die wichtiger für das Auge sind oder weniger wichtig. Diese werden dann aus dem gesamten Datenspektrum rausgefiltert und anschließend zusätzlich mit einem verlustfreien Algorithmus komprimiert.
MPeg ist übrigens noch raffinierter, dort werden nur Bildunterschiede gespeichert, und selbst dort nur Regionen und Vektoren, wenn zum Beispiel eine Kugel von links nach rechts fliegt, wird der Kugelbereich als Region festgelegt und ein Vektor gibt die Richtung an. So wird bei jedem Frame wirklich nur ein Bruchteil der eigentlichen Informationsmenge benötigt, die Bilder werden aus den vorangegangenen zusammengesetzt. Die so genannten Keyframes sind Vollbilder, die immer vollständig gespeichert werden. Damit vermeidet man Varianzen, die durch Rundungsfehler oder gar Berechnungsfehler auftreten, indem das Bild ab und zu mal wieder "refresht" wird.