
Die Komprimierung von Daten spielt immer wieder eine wichtige Rolle. Besonders im Zeitalter der mobilen Datennutzung möchte man die übertragene Datenmenge der anzuzeigenden Webseiten so gering wie möglich halten. Die kommende Version von conzept 16 wird um Funktionen erweitert, mit denen der Inhalt von Memory-Objekten und externen Dateien mit standardisierten Methoden komprimiert werden können.
Neue Befehle
Für die Komprimierung stehen die beiden Funktionen MemCompress()
und FsiFileCompress()
zur Verfügung, zur Dekomprimierung entsprechend MemUncompress()
und FsiFileUncompress()
.
Bei der Kompression werden folgende Formate unterstützt:
Die Formate ZLIB und GZIP basieren dabei auf dem Format von DEFLATE. Sie wurden um einen definierten Header- und Footer-Bereich erweitert. Beide Formate beinhalten zusätzlich eine Checksumme, über die beim Entpacken die Konsistenz der Daten geprüft wird. Keines der drei Formate beinhaltet eine Archivfunktion (vergleichbar mit ZIP oder RAR). Sie dienen der reinen Komprimierung einzelner Dateien.
Das jeweilige Format wird durch die Konstanten _ComprFmtDeflate
, _ComprFmtZlib
und _ComprFmtGzip
angegeben. Zusätzlich kann eine Kompressionsstufe zwischen 0 (keine Komprimierung) und 9 (maximale Kompression) oder mit _ComprLvlDefault
die Standardstufe angegeben werden.
Zur Dekomprimierung muss weder das Format noch die Kompressionsstufe angegeben werden. Der Algorithmus erkennt das Format automatisch.
Verwendung
Moderne Webbrowser unterstützen Kompressionsmethoden. Die Liste der unterstützten Methoden wird bei jeder Anfrage im Header-Eintrag “Accept-Encoding” an den Webserver geschickt. Wird der conzept 16-SOA-Service für die Aufbereitung von Daten für einen Webbrowser verwendet, können die Daten wie folgt komprimiert werden:
// HTTP-Headerfeld "Accept-Encoding" abfragen und auswerten
tEncoding # SysHTTP:HTTP.ReqHeaderGet('Accept-Encoding');
if (tEncoding != '')
{
if (tEncoding =* '*gzip*')
{
// Komprimierung der kompletten Daten des Memory-Objektes mit GZIP
// in der maximalen Stufe
gMem->MemCompress(_ComprFmtGzip, 9);
SysHTTP:HTTP.RspHeaderSet('Content-Encoding', 'gzip');
}
else if (tEncoding =* '*deflate*')
{
// Komprimierung der kompletten Daten des Memory-Objektes mit DEFLATE
// in der Standardstufe
gMem->MemCompress(_ComprFmtDeflate);
SysHTTP:HTTP.RspHeaderSet('Content-Encoding', 'deflate');
}
}
Für die Kommunikation wurde in dem Beispiel die Prozedur SysHTTP aus der Code-Library verwendet.
Bei den neuen Funktionen kann auch ein auszulesender Ausschnitt der Quelle, sowie ein separates Ziel angegeben werden. Wird kein separates Ziel angegeben wird die Quelle überschrieben. Beispielsweise kann eine externe Datei wie folgt komprimiert und die komprimierten Daten in eine andere Datei geschrieben werden:
FsiFileCompress('Update.d01', _ComprFmtGzip, _ComprLvlDefault, 0, 0, 'Update.d01.gz');
In dem vorangegangenen Beispiel stehen die zwei Nullen für Quellposition und Quelllänge. Ist hier jeweils 0
angegeben, wird die komplette Datei komprimiert.