Kompression

Ich habe ein Frontend für ein Komrpimierungs-system gebaut. Und zwar hat das vier Klassen:

  • TTypedStream
  • TCompressedStream
  • TCompressor
  • TDecompressor

TTypedStream ist ein Verteiler für die verschiedenene Kompressoren und Dekompressoren. TCompressedStream verwaltet je ein Paar Kompressor und Dekompressor. TCompressor ist der eigentliche Kompressor und ist ein eigener Thread, wie auch TDecompressor, der eigentliche Dekompressor. TTypedStream verwaltet außerdem einen Stream, der als Dongle die Daten von TCompressedStream empfängt und an die folgenden Stream weiterleitet.

Um Streams aneinander zu hängen wird der Ausgabe-Stream mit den Constructor übergeben:

EingabeStream:=TStream.Create(AusgabeStream,IstBesitzer); Beispiele:

Data:=TTypedStream.Create(TFileStream.Create(
'C:\Datei.fil',fmOpenRead or fmShareRead),true);

Data:=TTypedStream.Create(TMagicStream.Create(
TFileStream.Create('C:\Datei.fil',fmOpenRead or fmShareRead),true),true,Magic,MagicSize);

Die eigentliche Arbeit wird in TCompressor und TDecompressor gemacht. Daher sind diese Klassen alle von TNoneCompressor und TNoneDecompressor abgeleitet und stehen jeweils in einer eigenen Unit. In dieser Unit ist auch eine Beschreibungskonstante von Typ TCoDec, in der die Klassen angegeben werden. diese Konstante wird an TCompressedStream übergeben. Der Kompressor und Dekompressor kommt nicht mit den Streams in Berührung: Sie bekommen nur Speicherbereiche übergeben und geben auf dieselbe weise wieder Speicherbereiche zurück.

Es gibt schon folgende Kompressoren: Huffman, LZW, LZSS, LZH(eine kombination von LZW und Huffman), und BWT.