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
.