-
Gebiet der Erfindung
-
Die
vorliegende Erfindung bezieht sich auf ein System und ein Verfahren
zum Komprimieren und Dekomprimieren von Daten in Echtzeit.
-
Hintergrund der Erfindung
-
Eine
Datenkompression ist möglich,
weil Daten, die die Leute gewöhnlich
benutzen, eine Menge an Redundanz, d. h. Teile von Daten, die während der
gesamten Nachricht wiederholt werden, aufweisen. Zwei hauptsächliche
Typen von Kompressionsalgorithmen existieren, verlustlose Komprimierer
und verlustbehaftete Komprimierer. Der Unterschied zwischen den
beiden besteht darin, dass verlustreiche Algorithmen Informationen über die
Daten bei dem Kompressionsverfahren verlieren, und daher die Daten
nicht genauso dekomprimieren können,
wie sie waren. Verlustlose Kompressionsalgorithmen können in
zwei unterschiedliche Klassen unterteilt werden, statistische Verfahren
und Diktionär
basierende Verfahren. Die vorliegende Erfindung basiert auf einem
verlustlosen, Diktionär
basierendem Algorithmus. Verlustlose Kompressions- und Dekompressionsalgorithmen
sind im Stand der Technik bekannt. Es wird beispielsweise Bezug
genommen auf den LZ77-Algorithmus und seine Variationen (siehe beispielsweise
US-Patente Nr. 5,155,484 (Chambers),
4,701,745 (Waterworth) und
5,521,597 (Dimitri), um
einige zu nennen.
-
Der
LZ77-Kompressionsalgorithmus reduziert die Länge der Nachrichten, indem
wiederholte Datenmuster durch Referenzen auf diese Datenmuster ersetzt
werden. Die Referenzen werden mit einem Paar von Zahlen, der Länge der
wiederholten Daten und ihrem „Versatz" von dem vorhergehenden
Auftreten gegeben. Beispielsweise würde der String „abracadabra" als „<abracad><4,7>" komprimiert, was
bedeutet, dass die ersten sieben Zeichen keine wiederholten Daten
enthielten, und dass die letzten drei als eine Wiederholung von vier
Zeichen bezeichnet werden, die um sieben Zeichen in dem String zurückliegen.
Vier Zeichen (32 Bits) wären
durch ein Paar (2) von Zahlen ersetzt, die gelegentlich als Referenz
bezeichnet werden. Die Kompression tritt daher auf, wenn man die
zwei Zahlen in weniger als 32 Bits ausdrücken kann. Da Bits keine Bedeutung haben,
außer
wenn eine vorgegebene Darstellung existiert, muss man auch in der
Lage sein, zwischen einem Paar von Zahlen und einer Sequenz von
normalen Zeichen zu unterscheiden (dies wird durch die Symbole <> dargestellt). Dies bedeutet, dass zusätzliche
Bits benötigt
werden, um zu bestimmen, ob Bits eine Referenz oder tatsächliche
Zeichen darstellen.
-
Dieser
Typ von Algorithmus und seine Ableitungen davon sind effizient,
wenn es darauf ankommt, eine gesamte Datei zu komprimieren. Tatsächlich ist
eine der Charakteristiken des LZ77-Algorithmus, dass er „statische" Daten benötigt, um
die Kompression durchführen
zu können.
-
Mit
dem Auftreten des Internet sind jedoch Kommunikationen zwischen
zwei oder mehreren Benutzern immer häufiger. Diese Kommunikationen
sind entweder unkomprimiert oder komprimiert. Komprimierte Kommunikationen
erfordern es, dass der Benutzer eine Kompression der Daten vor dem
Abschicken der Kommunikation durchführt, und sie erfordern, dass
der Empfänger
eine Dekompression durchführt,
um die Kommunikation zu lesen. Andererseits erfordern unkomprimierte
Kommunikationen eine große
Bandbreite.
-
Es
gibt daher einen Bedarf, die Bandbreite auf Kommunikationsnetzwerken
einzuhalten, während
dennoch Datenkompressionen möglich
sind, und insbesondere an Systemen und Verfahren, um eine Datenkompression-
und Dekompression in Echtzeit durchzuführen.
-
US 4,730,348 (MacCrisken)
offenbart ein System zum Komprimieren und Dekomprimieren eines Eingabestrings
in Echtzeit, das einen Hash-Generator, der auf einen Zeichenstring
von dem Eingabestring anspricht, um einen Indexwert als eine Funktion
des Zeichenstrings zu erzeugen; eine Nachschlagetabelle, die eine
Vielzahl von adressierbaren Speicherplätzen hat, wobei jeder der einstellbaren
Speicherplätze
eine Hinweismarke auf eine einstellbare Speicherstelle in einer
Nachverfolgungstabelle speichert; eine Validierungseinrichtung,
die auf den Indexwert, der von dem Hash-Generator erzeugt wird,
und auf die Nachschlagetabelle anspricht, um festzustellen, ob die
Hinweismarke, die in der Nachschlagetabelle an einer Adresse entsprechend
dem Indexwert gespeichert ist, gültig
ist; eine Best-Übereinstimmungs-Auffindeeinrichtung,
die auf einer Anzeige von der Validierungseinrichtung, dass die
in der Nachschlagetabelle gespeicherten Daten gültig sind, anspricht, um die
Länge der
längsten
möglichen Übereinstimmung
zwischen dem Zeichenstring und den Daten von dem Eingabestring zu bestimmen;
eine Nachverfolgungstabelle, die eine Vielzahl adressierbarer, miteinander
geketteter Listen von Speicherplätzen
umfasst, wobei jede der adressierbaren, geketteten Listen der Speicherplätze einen
oder mehrere Speicherplätze
zum Speichern von Daten umfasst; und einen Token-Generator zum Erzeugen
einer Sequenz von Indikatoren, die komprimierte und nicht komprimierte
Zeichenstrings von dem Eingabestring darstellen, wobei die Indikatoren
in einem Ausgangsstring gespeichert werden.
-
Dennoch
gibt es immer noch den Bedarf für
eine effizientere Datenkompression und -dekompression in Echtzeit.
-
Zusammenfassung der Erfindung
-
Die
vorliegende Erfindung stellt ein System und ein Verfahren zum effizienten
und schnellen Komprimieren und Dekomprimieren von Daten in Echtzeit
zur Verfügung,
wobei mehrere neuartige Ansätze
für die Datenkompression,
einschließlich
der dynamischen Darstellung kodierter Werte, verwendet werden.
-
Eine
Ausführungsform
der vorliegenden Erfindung verarbeitet Zeichen dadurch, dass überprüft wird, um
festzustellen, ob sie vorher in dem Eingabestring zu sehen waren.
Wenn nicht, fügt
das vorliegende System und das Verfahren sie zu einem Diktionär oder einer
Tabelle hinzu, und wenn ja, findet das System und das Verfahren
die längste Übereinstimmung,
die mit dem vorherigen Auftreten des Zeichens oder der Zeichen und dem
oder den gerade überprüften Zeichen
möglich
ist. Wenn eine Übereinstimmung
gefunden wird, hat die vorliegende Erfindung eine Darstellung der
Zeichen, die nicht komprimiert werden konnten (wenn Zeichen zwischen
der letzten Übereinstimmung
und der vorliegenden vorhanden sind), und eine Darstellung für die übereinstimmenden
Zeichen. Dieses Verfahren wird wiederholt, bis keine Zeichen in
dem Eingabestring mehr vorhanden sind. Das vorliegende System und
Verfahren prüft
auf vorhergehendes Auftreten von einem oder mehreren Zeichen, und
es verwendet eine Nachschlagetabelle für diesen Zweck. Die Nachschlagetabelle
enthält einfache
Referenzen für
gekettete Listen derselben Zeichen. Der erste Knoten der Liste bezeichnet
das jüngste
Auftreten der Zeichen.
-
Die
vorliegende Erfindung verwendet auch einen Vektor von ganzen Zahlen,
die Expansionsschemata genannt werden, der eine binäre Darstellung
der Länge
der nicht komprimierten Zeichen (nlen); die Länge der übereinstimmenden Zeichen (mlen)
und die Anzahl der Zeichen, die seit der letzten Über einstimmung
verarbeitet worden sind (Versatz). Die Expansionsschemata erzeugen
Codes unterschiedlicher Länge,
die bei der Darstellung von Werten effizient sind, die genau abfallenden
Wahrscheinlichkeitsverteilungs-Funktionen gehorchen. Expansionsschemata
liefern auch einen in hohem Maße ökonomischen
Weg im Hinblick auf Speicherausnutzung, bei der Speicherung von
Bit-Darstellungen. Je nach der Anzahl der Bytes, die verarbeitet worden
sind, ändert
der Komprimierer seine Expansionsschemata um Änderungen der Wahrscheinlichkeitsverteilung,
der Länge
sowie des Versatzes aufzuzeigen.
-
Je
nach der Anzahl der Bytes, die verarbeitet worden sind, ändert der
Komprimirer seine Expansionsschemata, um Änderungen in der Wahrscheinlichkeitsverteilung
der Längen
und der Versetzungen wiederzugeben.
-
Der
Dekomprimirer, der der vorliegenden Erfindung zugeordnet ist, verwendet
einen Eingabestring, der aus Token besteht, die den ursprünglichen
String darstellen. Der Ausgabestring enthält den dekomprimierten String.
Der Dekomprimirer liest ein Token, wenn das Token ein c-Token (ein
Bit, das eine nicht komprimierte Sequenz, die nclen und die Zeichen
selbst anzeigt) ist, dann liest er die Länge der Sequenz, kopiert diese
Zeichen auf den Ausgabestring, liest den c-Token (ein Bit, das die
Sequenz, wenn es unmittelbar auf einen anderen c-Token folgt und
die Übereinstimmungslänge und
ein Versatzpaar oder mlen und Versatz in Kurzform anzeigt) ist,
kopiert er mlen – Zeichen
mit einem vorgegebenen Versatz zu dem Ausgabestring. Dies geht weiter, bis
alle Token gelesen sind.
-
Kurze Beschreibung der Zeichnungen
-
Diese
und andere Merkmale und Vorteile der vorliegenden Erfindung sind
besser verständlich
durch Lesen der folgenden detaillierten Beschreibung, wenn sie im
Zusammenhang mit den Zeichnungen genommen wird, in denen:
-
1 ein
Blockdiagramm eines Kompressionssystems gemäß der vorliegenden Erfindung
ist;
-
2 ein
Blockdiagramm des Dekompressionssystems gemäß der vorliegenden Erfindung
ist;
-
3 eine
schematische Darstellung von Strukturmanipulationen, die die temporäre Speicherstruktur nach
dem Stand der Technik umfasst, die eine Referenz nur zu dem letzten
Auftreten eines übereinstimmenden
Zeichenstrings macht;
-
4 eine
schematische Darstellung von Strukturmanipulationen ist, die die
Nachstarttabelle und das Nachverfolgungs-Tabellenfeld umfassen,
welches eine gekettete Liste von übereinstimmenden Zeichenstrings umfasst,
gemäß einem
Merkmal der vorliegenden Erfindung;
-
5 ein
Hochniveau-Flussdiagramm des Kompressionsverfahrens gemäß dem Verfahren
und dem System der vorliegenden Erfindung ist;
-
6 ein
Hochniveau-Flussdiagramm des Dekompressionsverfahrens gemäß dem Verfahren
und dem System der vorliegenden Erfindung ist;
-
7 ein detailliertes Flussdiagramm des
Kompressionsverfahrens gemäß dem Verfahren
und dem System der vorliegenden Erfindung ist;
-
8 ein detailliertes Flussdiagramm des
Dekompressionsverfahrens gemäß dem Verfahren
und dem System der vorliegenden Erfindung ist;
-
8 ein detailliertes Flussdiagramm der
Schreibe-C-Token-Unterroutine der vorliegenden Erfindung ist;
-
9 ein
detailliertes Flussdiagramm der Schreibe-NC-Token-Unterroutine der
vorliegenden Erfindung ist;
-
10 ein
detailliertes Flussdiagramm der Hash-Berechnungs-Unterroutine der
vorliegenden Erfindung ist;
-
11 ein detailliertes Flussdiagramm des
Verfahrens ist, um den längsten übereinstimmenden
String gemäß einem
Merkmal der vorliegenden Erfindung zu finden;
-
12 ein detailliertes Flussdiagramm des
Verfahrens ist, um die Nachschlagetabelle und die Nachverfolgungstabelle
auf den neuesten Stand zu bringe; und
-
13 eine
schematische Darstellung eines Ausgabestrings ist, der verschiedene
unkomprimierte Daten und Tokens gemäß einem Merkmal der vorliegenden
Erfindung enthält.
-
Beschreibung eines bevorzugten
Ausführungsbeispiels
-
Die
vorliegende Erfindung ist insbesondere auf ein System und ein Verfahren
zur Verwendung in Paketbasierenden Kommunikationen gerichtet, obwohl
ihre Verwendung nicht darauf beschränkt ist. Im Allgemeinen umfassen
solche Kommunikationen einen Kopf und die Kommunikationsdaten. Die
vorliegende Erfindung ist auf die Kompression und Dekompression
der Daten selbst gerichtet, um die Bandbreite (d. h. die Zeit) zu reduzieren,
die zum Versenden der Nachricht über
ein Netzwerk erforderlich ist. Eine der wichtigen Überlegungen
der vorliegenden Erfindung ist es, die Daten in Echtzeit komprimieren und
dekomprimieren zu können.
Obwohl die vorliegende Erfindung als eine Reihe von Computersoftwaremodule
beschrieben und erläutert
wird, ist dies keine Einschränkung
der vorliegenden Erfindung, sondern stellt nur ein Ausführungsbeispiel
und die gegenwärtig
bevorzugte Ausführungsform
dar.
-
Das
System und das Verfahren der vorliegenden Erfindung ermöglicht eine
mittlere Kompressionsrate von 30% bei typischen Beispielen einer
Internetkommunikation, die Standarddienstleistungen, beispielsweise „ftp", „http", „telnet", „flash", „java", „streaming" und „mpeg", verwenden. Bei
einer anfänglichen
Kommunikationssitzung mit 10 Megabyte und einer mittleren Kompressionsrate
von 30% ist beispielsweise die Information, die wirklich über das
Netzwerk gesendet wird, 7 Megabyte. Das System und das Verfahren
der Erfindung gestattet somit eine Optimierung von 1,4:1.
-
Die
Kompressionsrate steht in direkter Beziehung zu der Natur der Information,
die übertragen
werden soll. Es ist daher unmöglich,
eine konstante Kompressionsrate während einer Übertragung
vorherzusagen. Wenn es vorkommt, dass die Natur der Information,
die gesendet werden soll, nicht komprimierbar ist, und dass die
Verwendung des Systems und des Verfahrens der vorliegenden Erfindung
zu einer Erhöhung
der Größe des Pakets führen
würde,
würde das
Paket gesendet, ohne komprimiert zu werden.
-
Das
System und das Verfahren der vorliegenden Erfindung benutzt den
LZ77-Kompressionsalgorithmus mit wichtigen Modifikationen und einer
Optimierung als Basis, die das Kompressionsverhältnis an eingeschränkten Mengen
der Information (1,500 Byte im Falle von Internet) maximiert, um
es auf der Nutzlast eines Informationspakets während seiner Übertragung
zu verwenden. Ferner wurde die Leistungsfähigkeit erhöht, um die Kompression in Hochgeschwindigkeits-Übertragungsstrecken
anzuwenden.
-
1 ist
ein Blockdiagramm 10 des Systems zur Durchführung der
Datenkompression entsprechend der Lehre der vorliegenden Erfindung.
Der Eingabestring 12 ist ein Vektor aus Acht-Bit-Zeichen
(in diesem Zusammenhang bedeutet „Zeichen" einen beliebigen, möglichen Wert, den ein Feld
aus acht Bits annehmen kann, d. h. es existieren 28 =
256 mögliche
Zeichen). Bei der Kompression enthält der String die zu komprimierenden
Daten, und die Anzahl der Zeichen ist bekannt. Bei der Dekompression
enthält
dieser String den komprimierten String. Der Ausgabestring 14 ist
ein Vektor aus Acht-Bit-Zeichen.
Bei der Kompression enthält
dieser String die komprimierten Daten. Bei der Dekompression enthält er den
dekomprimierten String.
-
Der
Hash-Generator 16 ist für
die Berechnung der Indizes der Nachschlagetabelle verantwortlich.
Die Nachschlagetabelle 18, 4, ist ein
Feld von 65536 Hinweismarken (Pointern) zu der Nachverfolgungstabelle
(tractab) 20. Die Nachschlagetabelle 18 muss vor
der Kompression nicht initialisiert werden. Die Indizes in der Nachschlagetabelle
werden von dem Hash-Generatormodul erzeugt. Eine gültige Hinweismarke
in der Nachschlagetabelle zeigt auf einen Schlitz in der Nachverfolgungstabelle,
die eine einfache gekettete Liste von Auftrittereignissen desselben
Zeichenpaares enthält.
Das erste Element der Liste ist der am meisten zeitnahe Auftritt.
Die Gültigkeit
einer Hinweismarke in der Nachschlagetabelle wird durch das Validierungsmodul überprüft.
-
Die
Nachverfolgungstabelle 20 ist eine Struktur, die einen
sequentiellen Suchlauf gestattet, um den längsten übereinstimmenden String in
den bereits aufgetretenen Strings zu finden, die mit demselben Zeichenpaar
beginnen. Jeder tracktab-Schlitz enthält: eine Hinweismarke auf den
Eingabespeicher und eine Hinweismarke auf den vorher angetroffenen
tracktab-Schlitz, der den Hash-Wert des gleichen Zeichenpaares hat.
Dies bedeutet, dass jedes Mal dann, wenn ein Paar angetroffen wird,
ein neuer tracktab-Schlitz erzeugt und mit dem vorhergehenden verknüpft wird.
Die Hinweismarke in der Nachschlagetabelle zeigt immer auf das am
meisten zeitnahe Auftreten des Zeichenpaares. Im Gegensatz dazu
hat die Nachschlagetabelle 21, 3, des Standes der
Technik, die mit LZ77-Kompressions- und Dekompressoins-Algorithmen
verwendet wurde, nur einen Eintrag, der nur auf das letzte Auftreten
des Zeichenpaares hinweist.
-
Der
Hash-Generator 16 berechnet den Index wie folgt: er wird
mit einem Zeichenpaar erzeugt, das gegenwärtig einer Prüfung unterliegt
(ein Zeichen, auf das durch „look_cur" 22, 4,
hingewiesen wird, und das nächste
oder nachfolgende Zeichen). Er wird durch die Konkatenation dieser
beiden Zeichen vorgegeben. Da jedes Zeichen acht Bit breit ist,
ist somit der Hash-Code 16 Bit breit, wodurch sich Werte zwischen
0 und 65535 ergeben. Der Index, der durch das Hash-Generatormodul
gegeben wird, wird verwendet, um auf die Hinweismarke zu dem am
meisten zeitnahen tracktab-(Nachverfolgungstabellen-)Schlitz
zuzugreifen, der die Referenz zu dem gleichen Paar von Bytes wie
der der Prüfung
unterliegende bildet (bei look_cur).
-
Das
Validierungsmodul (oder die Validierungseinrichtung) 24 verifiziert,
dass eine gegebene Hinweis marke in der Nachschlagetabelle 18 eine
gültige
Hinweismarke ist. Um eine gültige
Hinweismarke zu sein, muss sie eine Referenz zu einem tracktab-Schlitz
innerhalb der Nachverfolgungstabelle 20 haben (zwischen dem
Start der Nachverfolgungstabelle und dem letzten oder am meisten
zeitnahen Element), und der tracktab-Schlitz muss eine Referenz
zu einem Paar von Bytes, das seinem Hash-Code entspricht. Wenn diese
Bedingungen wahr sind, dann ist die Hinweismarke in der Nachschlagetabelle 18 gültig, und
der Schlitz, auf der er in der tracktab (Nachverfolgungstablle)
als Referenz hinweist, ist ebenfalls gültig.
-
Das
Best-Übereinstimmungs-Auffindungsmodul 26 sucht
nach einem längsten, übereinstimmenden String
durch Überprüfung des
tracktab-Feldes. Der Best-Übereinstimmungs-Finder 26 startet
an dem tracktab-Schlitz, auf den durch die Eingabe in die Nachschlagetabelle 18 hingewiesen
wird. Der Eintrag in dieser Nachschlagetabelle ist das am meisten
zeitnahe (letzte) Auftreten der übereinstimmenden
Zeichen/des übereinstimmenden
Zeichens unter Überprüfung. Der
Best-Übereinstimmungs-Finder 26 beginnt
mit der Überprüfung von
Zeichen von der hingewiesenen Position in dem tracktab-Schlitz an,
um die maximale Länge
von jeder möglichen Übereinstimmung
zu bestimmen, und er geht dann zu der Position und der Länge der
längsten Übereinstimmung
zurück,
indem er sequentiell jeden tracktab-Schlitz in der Kette überprüft, auf
die durch den Nachschlagetabelleneintrag 18 hingewiesen
wird und jedes vorhergehende Auftreten Zeichenpaares unter Überprüfung.
-
Das
tracktab-Update-Modul modifiziert die Nachverfolgungstabelle 20 und
die Nachschlagetabelle 18, so dass sie Referenzen zu allen
möglichen
Auftritten des Zeichenpaares bilden, die vorher in dem Eingabestring
gesehen worden sind. Wie oben erwähnt wurde, stellt jede gültige (wie
durch das Validierungsmodul 24 bestimmt) Nachschlagetabellen-Hinweismarke 28,
die durch einen Index gegeben ist, der von dem Hash-Generator 16 mit
einem Zeichenpaar berechnet wird, einen Hinweis auf einen tracktab-Schlitz 30 des
am meisten zeitnahen Auftritts dieses Zeichenpaares. Dieser Schlitz
hat auch eine Hinweismarke 32 zu dem vorherigen Auftritt
des Paares. Das Update-Modul 34 erzeugt einen neuen tracktab-Schlitz,
initialisiert seine Zeichen-Hinweismarke auf die Position des in
der Überprüfung befindlichen
Zeichens (bei look_cur), initialisiert seine Hinweismarke zu einem
vorhergehenden Auftritt auf die Adresse des tracktab-Schlitzes,
auf die durch die Nachschlagetabelle-Hinweismarke hingewiesen wird,
und initialisiert die Nachschlagetablle-Hinweismarke auf die Adresse
des neuen tracktab-Schlitzes (am meisten zeitnaher Auftritt des
Byte-Paares).
-
Das
Token-Generatormodul 36 übernimmt die Aufgabe, die Token
zu erzeugen, die Sequenzen von nicht komprimierten Zeichen (nc-Token)
oder übereinstimmenden/komprimierten
Zeichen (c-Token) repräsentieren.
Er schreibt auch diese Token zu dem Ausgabestring 14. Das
Token-Generatormodul 36 modifiziert auch die Expansionsschemata,
die zum Schreiben von nclen, mlen und Versatz(offset)werten verwendet
werden, auf der Grundlage der Position der Nachschlage-Positionsmarke
in dem Eingabestring.
-
Das
Token-Lesemodul 40, 2, ist Teil
des Dekomprimierers 42. Es liest Token von dem Eingabestring 14 (welches
der Ausgabestring des Komprimierers 10 ist) und extrahiert
nclen-, mlen- und Versatz-Wert. Das Token-Lesemodul 40 teilt
auch dem Unterstring-Kopiermodul 44 mit, wie viele Zeichen
zu dem Ausgabestring 46 beschrieben werden sollen und wo
diese Zeichen zu erhalten sind.
-
Wie
alle LZ77-Komprimierer hat die vorliegende Erfindung ein Zeichenfenster,
auf das Bezug genommen werden kann, und Zeichen außerhalb
des Fenster können
nicht für
die Kompression verwendet werden. Eine in Bezug auf Speicherplatz
effiziente Art der Speicherung des tracktab-Feldes und des Eingabestrings
ist ein Ringspeicher. In diesem Zusammenhang werden eine festgelegte
Anzahl von tracktab-Schlitzen verwendet, und alte Schlitze werden
durch neuere Schlitze ersetzt.
-
Die
Schritte, die durch das Verfahren der vorliegenden Erfindung verwendet
werden, um Daten zu komprimieren, sind recht einfach. Sie können, wie
in 5 gezeigt ist, wie folgt zusammengefasst werden: nach
dem Bestimmen, dass mehr als ein (1) Zeichen in dem Eingabestring
vorhanden ist, Schritt 60, und nach dem Berechnen eines
Hash-Wertes zu dem gegenwärtigen, überprüften Zeichenpaar,
Schritt 62, verarbeitet das Verfahren Zeichen, indem es überprüft, ob sie
vorher in dem Eingabestring gesehen worden sind, Schritt 64.
Wenn nicht, füge
sie zu der Nachschlagetabelle hinzu, Schritt 66, und, wenn
ja, finde die längste
mögliche Übereinstimmung
mit dem vorhergehenden Auftreten der Zeichen oder des Zeichens unter Überprüfung, Schritt 68,
und führe
ein Update der Nachschlagetabelle durch, Schritt 70. Wenn
eine Übereinstimmung
gefunden wird, schreibe ein nc-Token, das die Zeichen repräsentiert,
die nicht komprimiert werden konnten (wenn jegliche Zeichen zwischen
der letzten Übereinstimmung
und der gegenwärtigen
vorhanden sind) und ein c-Token, um die Übereinstimmung zu repräsentieren,
Schritt 72. Wiederhole dieses Verfahren, bis keine Zeichen in
dem Eingabestring übrig
sind.
-
Das
Verfahren der vorliegenden Erfindung überprüft die früheren Auftritte eines Zeichenpaares
und verwendet eine Nachschlagetabelle 18, 4,
zu diesem Zweck. Die Nachschlagetabelle referenziert einfach gekettet
Listen 31 derselben Zeichenpaare. Der erste Knoten 50 der
Liste referenziert das am meisten zeitnahe Auftreten des Zeichenpaares.
Die binäre
Darstellung von nclen-, mlen- und Versatz-Werten werden durch einen Vektor aus
geraden Zahlen gegeben, was „Expansionsschemata" genannt wird. Expansionsschemata erzeugen
Codes variabler Länge,
die bei der Darstellung von Werten effizient sind, die strikt abfallenden Wahrscheinlichkeitsverteilungsfunktionen
gehorchen. Expansionsschemata tiefem auch einen in hohem Maße ökonomischen
Weg in Bezug auf die Speicherausnutzung zum Speichern von Bit-Darstellungen.
-
Im
wesentlichen arbeitet das Verfahren der vorliegenden Erfindung auf
dem folgenden Prinzip: Es ist ein Allgemeinplatz, dass die Häufigkeit,
mit der jede Länge
in der Kompression angetroffen wird, nach dem Wert der Länge stark
abnimmt. Beispielsweise haben viele Tests gezeigt, dass man in etwa
50% der Zeit eine Länge
von 2 schreibt, in 25% der Zeit von 3 schreibt, in 12% der Zeit
von 4 schreibt usw., durch Division jeder Vergrößerung um 1 der Länge. Folglich
ist es für
den Zweck der vorliegenden Erfindung wesentlich, den Wirkungsgrad
bei all den kurzen Sequenzen so weit wie möglich zu maximieren, da sie
viel häufiger
auftreten. Dies hat selbstverständlich
als Ergebnis eine Strafe für
die Längen
größer als
7, diese sind jedoch sehr selten, d. h. zwischen 5% und 10% der
Zeit.
-
Folglich
ist das Verfahren der vorliegenden Erfindung für die Kompression von kleinen
Sequenzen, beispielsweise solchen, die auf einem Datenpaket auf
einem Netzwerk zu finden sind, wo die Länge im Allgemeinen kleiner
ist, gut geeignet. Da die Kompression auf kleine Sequenzen gerichtet
ist, muss man ferner das Schreiben der Übereinstimmungslänge, der
nicht komprimierten Länge
und des Versatzes als eine Funktion der Größe der Daten maximieren.
-
Zur
Unterscheidung zwischen Sequenzen von Zeichen und Übereinstimmungen
(Paare von Zahlen <Länge, Versatz>) geht das Verfahren
der vorliegenden Erfindung wie folgt vor. Wenn das gelesene Bit
eine 0 ist, erfolgen als nächstes
eine Sequenz von Zeichen und eine Übereinstimmung, wenn das gelesene
Bit 1 ist, folgt als nächstes
eine Übereinstimmung.
Dies geht, weil zwei aufeinander folgende Sequenzen von Zeichen als
eine betrachtet werden können,
d.h. „<abra><cada>" ist äquivalent
zu „<abracada>". Da eine Übereinstimmung immer einer
Sequenz von Zeichen folgt, ist nur ein Bit erforderlich, um zwischen „<seq><mlen, offset>" und „<mlen, offset>" zu unterscheiden. Es ist auch erfor derlich,
die Länge
der Sequenz der Zeichen zu kennen. Dies wird gewöhnlich als nicht komprimierte
Länge oder
kurz nc-Länge
bezeichnet. Ein nc-Token entspricht dem Bit, das die Sequenz, die
nc-Länge und
die Zeichen selbst anzeigt. Ein komprimierter Token oder c-Token besteht
aus einem Bit, das die Sequenz anzeigt, wenn er unmittelbar einem
anderen c-Token folgt, und die Übereinstimmungslänge und
das Versatz-(OFFSET) Paar oder mlen und Offset in Kurzform. Die
Verfahren zum Beschreiben eines c-Tokens und eines nc-Tokens sind
im Einzelnen in den 9 und 10 gezeigt
und beschrieben.
-
Der
Dekomprimierer gemäß der vorliegenden
Erfindung ist recht einfach. In diesem Zusammenhang besteht der
Eingabestring aus Tokens, die den ursprünglichen String repräsentieren
und am Ende enthält
der Ausgabestring den dekomprimierten String. Wenn zu lesende Bytes
in dem Eingabstring übrig
sind, Schritt 80, 6, liest
der Dekompremierer einen Token, Schritt 82. Wenn der Token
ein nc-Token ist,
liest der Dekompremierer die Länge
der Sequenz, kopiert diese Zeichen zu dem Ausgabestring, liest den
c-Token, der folgt, und kopiert mlen Zeichen an dem vorgegebenen
Versatz zu dem Ausgabestring, Schritt 84. Wenn der Token
ein c-Token ist, kopiert der Dekompremierer mlen – Zeichen
an einem vorgegebenen Versatz zu dem Ausgabestring, Schritt 84.
Dies geht weiter, bis alle Token gelesen sind.
-
Ein
Merkmal des Verfahrens und des Systems der vorliegenden Erfindung
ist die Art und Weise, binäre Darstellungen
zu Längen
und Versatzwerten zuzuordnen. Dies kann als dynamische Modifikation
der Expansionsschemata beschrieben werden. Expansionsschemata sind
Vektoren von ganzen Zahlen, die expandiert werden können, um
alle binären
Darstellungen der gewünschten
Werte zu erhalten. Je nach der Anzahl der Bytes, die verarbeitet
worden sind, verändert
der Komprimierer seine Expansionsschemata, um Änderungen in der Wahrscheinlichkeitsverteilung
der Längen
und Versatzwerte wiederzugeben.
-
Es
wird die Kompression eines Stroms oder Eingabestrings aus 1000 Zeichen
betrachtet. Es ist ersichtlich, dass nicht alle Werte für die Länge und
den Versatz einer Übereinstimmung
möglich
sind. Wenn die zwei Zeichen, die gerade studiert werden, das fünfte und
sechste Zeichen sind, ist beispielsweise bekannt, dass es möglich ist,
eine Übereinstimmung
mit einem Versatz länger
als 4 und/oder einer Übereinstimmungslänge länger als
996 zu haben. Da es in hohem Maße
uneffizient ist, binäre
Darstellungen Werten zuzuordnen, die nicht verwendet werden, definieren
wir Expansionsschemata, die für einen
vorgegebenen Bereich in dem Eingabestring optimal sind. Jedes Element
a[i] des mlen- und nclen-Expansionsschemas ist ein Inkrement zu der
Zahl der Bits, die für
die nächsten
2
a[i]-1 Werte zu verwenden ist. Wir nehmen
beispielsweise an, dass das Expansionsschema {1,1,2} ist, was bedeutet,
dass der erste Wert 2
1-1 auf 1 Bit repräsentiert
wird. Da das zweite Element des Expansionsschemas eine 1 ist, wird
der nächste
Wert auf zwei Bits repräsentiert
(die Anzahl der Bits des vorhergehenden Wertes plus 1). Die letzten
drei Werte werden auf vier Bits repräsentiert. Die Werte, die wir
mit diesem Schema repräsentieren
können,
sind in Tabelle 1 unten gezeigt: Tabelle 1: Beispiele der Expansion des
{1,1,2}-Expansionsschemas
| Vektor | |
Wert | 1
1 2 | Anzahl
der Bits |
1 | 1 | 1 |
2 | 0
1 | 2 |
3 | 0
0 01 | 4 |
4 | 0
0 10 | 4 |
5 | 0
0 11 | 4 |
-
Wie
oben erwähnt
wurde, sind Expansionsschemata ein effizienter Weg zum Speichern
der binären Darstellung
der zu kodierenden Werte. In dem vorhergehenden Beispiel würden wir
einfach drei Zahlen ({1, 1, 2}) statt fünf binären Darstellungen und ihre
Länge speichern.
-
Während mehr
und mehr Bytes in der Eingabe verarbeitet werden, nimmt der maximal
mögliche
Versatz zu und der Übereinstimmungslängenwert
nimmt ab. Wir können
dies bei der dynamischen Modifizierung der Expansionsschemata sowohl
für den
Versatz als auch für
die Übereinstimmungslänge ausnutzen.
Wir können
auch Expansionsschemata so definieren, dass sie die Länge von
nicht komprimierten Sequenzen ausdrücken. Durch Berechnen der Wahrscheinlichkeitsverteilungen
der Übereinstimmungslängen, der
Versatzwerte und der Längen
der nicht komprimierten Sequenzen auf der Grundlage der Position
in dem Eingabestring kann die vorliegende Erfindung die optimalen,
zu verwendenden Expansionsschemata für jeden ausgewählten Bereich
von Positionen finden.
-
Die
vorliegende Erfindung nutzt Vektoren von Expansionsschemata aus,
um den Prozessor in die Lage zu versetzen, die Codes, die den Übereinstimmungslängen zugeordnet
sind, die Versatzwerte und die Länge
der nicht komprimierten Sequenzen dynamisch zu ändern. Drei diskrete Vektoren
werden verwendet, weil die Wahrscheinlichkeitsverteilungen für diese
drei Elemente recht unterschiedlich voneinander sind, und weil unterschiedliche
Vektoren es ermöglichen,
dass die Codes an die Verteilungen angepasst werden. Die Anzahl
der Expansionsschemata pro Vektor muss gleich groß sein wie
die erwünschte
Anzahl von dynamischen Änderungen
in den Codes (sie kann von 1 bis N, der maximalen Größe der zu
komprimierenden Daten, gehen). Die Anzahl kann beliebig ausgewählt werden,
oder sie kann durch eine ordnungsgemäße, statistische Analyse bestimmt
werden. Die Position, an der der Komprimierer von einem Expansionsschema
zu dem nächsten
wechselt, kann ebenfalls beliebig gewählt oder durch eine statistische
Analyse bestimmt werden.
-
Das
Folgende ist ein Beispiel eines Codes des C-Codes, der einen Vektor
für die
Positionen liefert, an denen die Expansionsschemata geändert werden
könnten,
wobei neunzehn Änderungen
umfasst werden.
Unsigned int bsizesswitch [19] =
(32,
64, 96, 128, 192, 256, 320, 384, 448, 512, 640, 768, 896, 1024,
1280, 1536, 2048, 3072, 4096);
-
Dies
bedeutet, dass, wenn mehr als 31 Byte der Eingabe verarbeitet worden
sind, der Prozessor das gegenwärtige
Expansionsschema in ein zweites Expansionsschema ändert, wenn
mehr als 63 Byte verarbeitet worden sind, ändert er das Expansionsschema
auf ein drittes, und dies geht so weiter, bis das Ende der Eingabe
erreicht worden ist. Wenn keine Änderungen
auftreten, wird das gleiche Expansionsschema beibehalten. Ein spezifischer
Vektor von Positionen könnte
auch für
jeden Typ von Codes existieren, die wir verändern wollen (Übereinstimmungslängen, Offsetwerte
usw.).
-
Tabelle
2: Bit-Darstellungen. Gegeben durch das mlen – Expansionsschema {1,2,4,4,7,12}
-
Übereinstimmungslängen (mlen)
können
gemäß dem folgenden
Vektor von Expansionsschemata geschrieben werden:
Unsigned
int mlen_exp[][6] =
{{1, 2, 4, 4, 7, 12},
{1, 2, 5, 6,
8, 12},
{1, 2, 4, 4, 7, 12},
{1, 2, 5, 7, 9, 12}
{1,
2, 5, 7, 9, 12}
{1, 2, 5, 7, 9, 12}
{1, 2, 5, 7, 9, 12}},
-
Diese
Vektoren enthalten 7 unterschiedliche Expansionsschemata mit je
6 ganzen Zahlen. Normalerweise werden die tatsächlichen Werte, die in den
Expansionsschemata enthalten sind, entsprechend den Ergebnissen
einer vorherigen Analyse der Messdaten zugeordnet. Die Expansionsschemata
können
eine beliebige Anzahl von ganzen Zahlen enthalten (solange es genügend Codes
gibt, um alle möglichen
Werte darzustellen), und der Vektor der Expansionsschemata sollte
eine Anzahl von Expansionsschemata enthalten, die gleich der Anzahl
ist, mit der eine dynamische Änderung
der Codes erwünscht
ist.
-
Binäre Codes,
die Übereinstimmungslängen repräsentieren,
starten an einem Wert 2, weil die minimale Übereinstimmungslänge, die
verwendet werden kann, die Länge
2 ist. In anderen Worten werden keine binären Darstellungen für die Werte
0 oder 1 für
mlen verschwendet, da sie ohnehin nicht verwendet würden. Tabelle 3: Bit-Darstellungen gegeben durch
das nclen – Expansionsschema
{1,2,2,3,5,12}
| Vektor | |
Wert | 1 2 2 3
5 12 | Anzahl
der Bits |
1 | 1 | 1 |
2 | 0 01 | 3 |
3 | 0 10 | 3 |
4 | 0 11 | 3 |
5 | 0 00 01 | 5 |
6 | 0 00 10 | 5 |
7 | 0 00 11 | 5 |
8 | 0 00 00
001 | 8 |
... | ... | ... |
14 | 0 00 00
111 | 8 |
15 | 0 00 00
000 00001 | 13 |
... | ... | ... |
45 | 0 00 00
000 11111 | 13 |
46 | 0 00 00
000 00000 000000000001 | 25 |
... | ... | ... |
4140 | 0 00 00
000 00000 111111111111 | 25 |
-
Die
Längen
der nicht komprimierten Byte-Sequenzen (nclen) werden ebenfalls
unter Verwendung von Expansionsschemata kodiert. Diese Vektoren
sind jedoch unterschiedlich, da ihre Wahrscheinlichkeiten unterschiedlich
sind. Nicht komprimierte Längen
(nclen) könnten
entsprechend den folgenden Vektor-Expansionsschemata geschrieben werden:
Unsigned
int nclen_exp[][6] =
{{1, 2, 3, 3, 5, 12},
{1, 2, 3, 4,
5, 12},
{1, 2, 4, 5, 7, 12},
{1, 2, 4, 5, 7, 12},
{1,
2, 4, 5, 7, 12},
{1, 2, 4, 5, 7, 12}}
-
Tabelle
3 gibt ein Beispiel von nclen-Werten und ihrer binären Darstellung
gegeben durch das Expansionsschema {1, 2, 2, 3, 5, 12}. Die Versatz-Codes ändern sich
ebenfalls dynamisch in ähnlicher
Weise unter Verwendung des gleichen Prinzips. Der Unterschied zwischen
den Codes, die für
die Übereinstimmungslängen und
die Versatzwerte erzeugt werden, besteht darin, dass den Versatzwerte
ein Längenindikator
mit einem festen Bi voran gestellt wird, und dass die ganzen Zahlen
der Expansion nicht die gleiche Bedeutung haben. In dem bevorzugten
Ausführungsbeispiel
wird die Länge
des Feldes auf drei Bits gesetzt. Tabelle 4: Bit-Darstellungen gegeben durch
das Versatz-Expansionsschema {1,1,1,1,1,1,4}
Versatz
(offset) | Versatz-Code | Anzahl
der Bits |
| Indikator | Rest | |
1 | 000 | 0 | 4 |
2 | 000 | 1 | 4 |
3 | 001 | 0 | 4 |
4 | 001 | 1 | 4 |
5 | 010 | 0 | 4 |
6 | 010 | 1 | 4 |
7 | 011 | 0 | 4 |
8 | 011 | 1 | 4 |
9 | 100 | 0 | 4 |
10 | 100 | 1 | 4 |
11 | 101 | 0 | 4 |
12 | 101 | 1 | 4 |
13 | 110 | 00 | 5 |
14 | 110 | 01 | 5 |
15 | 110 | 10 | 5 |
16 | 110 | 11 | 5 |
17 | 111 | 0000 | 7 |
... | ... | ... | ... |
32 | 111 | 1111 | 7 |
-
Der
Drei-Bit-„Indikator" teilt dem Dekomprimierer
mit, wie viele Bits gelesen werden sollen, um den Versatz zu bestimmen.
Die Anzahl der zu lesenden Bits sind ganze Zahlen des Expansionsschemas,
und ihre Position entspricht den Drei-Bit-Indikatoren. Die Werte,
die von den vorhergehenden Indikatoren verwendet werden, werden
auch von dem gewünschten
Wert subtrahiert, um so wenig Code-Raum wie möglich zu verschwenden. Das
folgende ist ein Beispiel für
Expansionsschemata von Versatzwerten.
Unsigned int nclen_exp[][8]
=
{{1, 1, 1, 1, 1, 1, 2, 4},
{1, 1, 2, 3, 3, 3, 3, 5},
{2,
4, 4, 4, 4, 4, 6, 6},
{2, 5, 5, 5, 6, 6, 7, 7},
{4, 5,
5, 6, 7, 7, 8, 8},
{5, 6, 8, 8, 8, 8, 9, 11}}
-
Wenn
die verwendete Versatz(offset)-Expansion gleich {1, 1, 2, 3, 3,
3, 3, 5) ist, wird der Wert 5 als 01000 kodiert. Dieses Verfahren
ist wie folgt: für
jede der Zahlen offset_exp[1][i] der Expansion soll 2(offset_exp[1][i]) errechnet
und überprüft werden,
ob sie größer als
die zu kodierende Zahl ist. Wenn sie größer ist, subtrahiere diesen
Wert von der zu kodierenden Zahl, inkrementiere i und wiederhole
dieses Verfahren, bis die erhaltene Zahl kleiner als 2(offset_exp[1][i]) ist.
Subtrahiere 1 von dem Rest der zu kodierenden Zahl (dies geschieht
deshalb, weil wir keinen Code benötigen, um einen Versatz von
0 darzustellen, und deshalb ziehen wir diese Möglichkeit ab). Schreibe i auf
drei Bits und schreibe den Rest der Zahl auf offset_exp[1][i]-Bits.
In dem vorhergehenden Fall ergibt dies 5-21-21-1=0 bei i=2, so dass die binäre Darstellung
gleich 01000 ist, d. h. 2 auf drei Bits konzentriert mit dem Wert
0 auf 2 Bit. Die Tabelle 4 ist ein Beispiel von Versatzwerten und
ihrer binären
Darstellung, wie sie durch das Expansionsschema {1, 1, 1, 1, 1,
1, 2, 4} gegeben ist.
-
Als
Beispiel eines teilweisen Ausgabestrings 100 zeigt 13 den
Aufbau des Ausgabestrings in Begriffen von Zeichen (im Falle keiner Übereinstimmung)
und Token (sowohl Übereinstimmungs-
als auch Nicht-Übereinstimmungs-Token).
Es sei angenommen, dass der zu komprimierende Zeichenstring gleich „abracadebrabrac" ist, sind die Komprimierungsschritte
wie folgt (es ist zu beachten, dass den binären Zahlen der Buchstabe „b" nachgestellt ist,
um sie von den Standardzahlen auf der Basis von 10 unterscheiden):
der Hash-Generator erzeugt einen Index mit den ersten zwei (2) Zeichen „ab"; die Validierungseinrichtung
bestimmt, ob dieses Zeichenpaar vorher aufgetreten ist. In dem gegenwärtigen Beispiel
sind sie nicht aufgetreten, und daher werden die Nachschlagtabelle
und die Nachverfolgungstabelle auf den neuesten Stand gebracht,
so dass sie die Referenz auf dieses Zeichenpaar enthält. Der
Komprimierer kodiert dann das nächste Zeichenpaar
(„br"), gefolgt von dem
nächsten
Zeichenpaar („ra") usw. solange keine Übereinstimmung
auftritt, und er macht ein Update der Datenstrukturen, bis er eine Übereinstimmung
findet. Das zweite Mal, wenn der Zeichenpaarstring „br" auftritt, stellt
die Validie rungseinrichtung eine Übereinstimmung fest. Der Best-Übereinstimmung-Finder
berechnet die Länge
der Übereinstimmung
und findet eine Übereinstimmungslänge (mlen) von
drei (3) Zeichen „bra", der Versatz (Anzahl
von Zeichen seit dem Beginn der vorhergehenden Übereinstimmung) ist 7, und
die Anzahl der nicht komprimierten Zeichen (nclen) ist 8 (d. h.
die Zeichen „abracade").
-
Der
Token-Generator erzeugt dann einen nc-Token 102 und einen
c-Token 103 zu dem Ausgabestring 100. Der nc-Token
besteht aus einer Marke (ncm) 104 (das Bit „0" in diesem Beispiel),
die eine nicht komprimierte Sequenz anzeigt, gefolgt von dem nclen-8-Code
und der Ascii-Darstellung der 8 Zeichen selbst. Der c-Token 103 enthält den mlen-3-Code
und den Versatz-7-Code. Die Bit-Muster werden entsprechend den Expansionsschemata
{1, 2, 2, 3, 5, 12} für
den nclen, {1, 2, 4, 4, 7, 12} für
den mlen und {1, 1, 1, 1, 1, 1,2, 4} für den Versatz erzeugt. Die
Expansionsschemata des ersten Niveaus werden verwendet, weil die
Anzahl der verarbeiteten Zeichen kleiner als 32 Zeichen ist (der
erste Wert des Bsizeswitch-(Umschalt) Vektors). Dies ergibt den
Code 00000001(b) für
einen nclen von 8, 001(b) für
einen mlen von 3 und 0110(b) für
einen Versatz von 7.
-
Das
Verfahren startet wiederum und überprüft nun den
nächsten
Zeichenstring, das Zeichenpaar „br". Die Validierungseinrichtung erfasst
eine Übereinstimmung,
der Best-Übereinstimmungs-Finder
berechnet eine Übereinstimmung
der Länge
3 („bra") mit dem vorherigen
Auftreten von „br" und eine Übereinstimmungslänge von
4 („brac") mit dem ersten
Auftreten. Der mlen von 4 wird als beste Übereinstimmung ausgewählt, sein
Versatz ist 10. Der Token-Generator gibt dann einen anderen c-Token 105 aus.
Der c-Token 105 besteht aus einer komprimierten Marke cm 106 (das
Bit 1), da der letzte Token ein c-Token war, einem mlen von 4 (beschrieben als
010(b)) und einem Versatz von 10 (geschrieben als 1001(b)).
-
Modifikationen
und Ersatzmerkmale durch einen Durchschnittsfachmann werden als
innerhalb des Schutzumfangs der vorliegenden Erfindung betrachtet,
der nicht eingeschränkt
ist mit Ausnahme durch die folgenden Ansprüche.
-
1
-
- 12 = Eingabestring
- 34 = Nachverfolgungstabellen-Update-Modul
- 16 = Hash-Generatormodul
- 24 = Validierungsmodul (Validierungseinrichtung)
- 26 = Best-Übereinstimmungs-Findermodul
- 36 = Token-Generatormodul
- 14 = Ausgabestring
-
2
-
- 14 = Eingabestring
- 40 = Token-Lesemodul
- 44 = Kopiermodul-Unterstring
- 46 = Ausgabestring
-
3
-
- PRIOR ART = Stand der Technik
- COPIED AND ANALYZED BYTES = kopierte und analysierte Bytes
- NOT COPIED AND NOT ANALYZED BYTES = nicht kopierte und nicht
analysierte Bytes
- START OF INPUT STORE = Start von Eingabespeicherung
- LOOK CUR = Lesecursor LOOK cur
- END OF INPUT STORE = Ende von Eingabespeicherung
- TEMPORARY STORE = Zeitweise Speicherung
-
4
-
- COPIED AND ANALYZED BYTES = kopierte und analysierte Bytes
- NOT COPIED AND NOT ANALYZED BYTES = nicht kopierte und nicht
analysierte Bytes
- START OF INPUT STRING = Start von Eingabestring
- LOOK CUR = Lesecursor LOOK CUR
- END OF INPUT STRING = Ende von Eingabestring
- LOOKUP TABLE = Nachschlagetabelle
- TRACKTAB ARRAY = Nachverfolgungstabellenfeld
-
5
-
- COMPRESSION = Komprimierung
- 60 = Ist mehr als ein Zeichen in dem Eingabestring?
(Eingabestringmodul)
- No = Nein
- Yes = Ja
- WRITE LAST NCTOKEN TO OUTPUT STRING (TOKEN GENERATOR MODULE)
= Schreibe letzten NC-Token zu dem Ausgabestring (Token-Generatormodul)
- 62 = Berechne Hash-Wert mit dem gegenwärtigen Zeichenpaar
(Hash-Generatormodul)
- 66 = Mache Update der Nachschlagetabelle und des Nachverfolgungstabellenfeldes
auf die gegenwär
tige Position (Nachverfolgungstabellen-Update-Modul)
- 64 = Wurde diesem Paar in dem Eingabestring vorher
begegnet? (Validierungsmodul)
- 68 = Berechne Best-Übereinstimmungs-Länge (Best-Übereinstimmungs-Findermodul)
- 70 = Mache Update der Nachschlagetabelle und des Nachverfolgungstabellenfeldes
für alle
Elemente in dem übereinstimmenden
String (Nachfolgetabelle-Updatemodul)
- 72 = Schreibe C-Token und NC-Token zu dem Ausgabestring
(Tokengeneratormodul)
- END COMPRESSION = Ende der Komprimierung
-
6
-
- DECOMPRESSION = Dekomprimierung
- 80 = Sind alle Bytes des Eingabestrings verarbeitet?
(Eingabestring)
- No = Nein
- Yes = Ja
- 82 = Lese Token (Tokenlesemodul)
- 84 = Kopiere dekomprimierten Unterstring zu dem Ausgabestring
(Unterstring-Kopiermodul)
- END DECOMPRESSION = Ende der Dekomprimierung
-
7A
-
- COMPRESSION = Komprimierung
- SET LOOK AND CUR TO THE 1ST CHARACTER OF INPUT STRING = Setze
LOOk und CUR auf das erste Zeichen des Eingabestrings
- INCREMENT LOOK = Inkrementiere LOOK
- IS THERE MORE THAN 1 CHARACTER LEFT TO ANALYZE IN THE INPUT
STRING? = Ist mehr als ein Zeichen übrig zum Analysieren in dem
Eingabestring?
- No = Nein
- Yes = Ja
- ARE THERE ANY NOT COPIED BYTES IN THE INPUT STRING? = Gibt es
irgendwelche nichtkop ierte Bytes in dem Eingabestring?
- TRACKTAB UPDATER MODULE = Nachverfolgungstabellen-Update-Modul
- STORE THE ADDRES OF THIS TRACKTAB SLOT AT INDEX IN THE LOOKUP
TABLE = Speichere die Adresse dieses Nachverfolgungstabellenschlitzes
an dem Index in der Nachschlagetabelle
- FILL THE NEXT FREE TRACKTAB SLOT WITH THE POINTER LOOK AS INPUT
STRING POINTER AND A NULL POINTER AS PREVIOUS TRACKTAB POINTER =
Fülle den
nächsten
freien Nachver folgungstabellenschlitz mit der Hinweismarke als
Eingabestring-Hinweismarke und eine Null- Hinweismarke als frühere Nachverfolgungstabellen-Hinweismarke
- FROM = von
- EVALUATE INDEC HASHFUNCTION (LOOK) = Ermittle Index-Hashfunktion
(LOOK)
- HASH GENERATOR MODULE = Hash-Generatormodul
- WRITE NCTOKEN = Schreibe NC-Token
- TOKEN GENERATOR MODULE = Tokengeneratormodul
- END COMPRESSION = Ende der Komprimierung
-
7B
-
- FROM = von
- VALIDITY MODULE = Validierungsmodul
- POINTER AT INDEX IN LOOKUP TABLE POINTS TO A VALID TRACKTAB
SLOT? = Zeigt eine Hin weismarke an dem Index in der Nachschlagetabelle
auf einen gültigen
Nachverfolgungstabellenschlitz?
- No = Nein
- Yes = Ja
- SET PRE TO THE INPUT STRING POINTER OF THE TRACKTAB SLOT POINTED
BY THE LOOKUP TABLE POINTER = Setze PRE an die Eingabestringhinweismarke
des Nachverfolgungstabellen schlitzes, auf den durch die Nachschlagetabelle-Hinweismarke
hingewiesen wird.
- IS THE CURRENT PAIR POINTED BY LOOK IDENTICAL TO THE ONE AT
PRE? = Ist das gegenwär
tige Paar, auf das durch LOOK hingewiesen wird, identisch mit dem
bei PRE?
- SEARCH FORT HE BEST MATCH LENGTH = Suche nach der Best-Übereinstimmungs-Länge
- BEST MATCH FINDER MODULE = Best-Übereinstimmungs-Findermodul
- UPDATE THE LOOKUP TABLE AND THE TRACKTAB ARRAY = Mache Update
von Nachschlageta belle und Nachverfolgungstabellenfeld
- CHANGE THE EXPANSION SCHEME IF REQUIRED = Ändere das Expansionsschema,
wenn erforderlich
- ARE THERE ANY CHARACTERS BETWENN LOOK AND CUR? = Gibt es irgendwelche
Zeichen zwischen LOOK und CUR? (Look-cur! = 0)
- WRITE NCTOKEN = Schreiben NC-Token
- WRITE CTOKEN = Schreibe C-Token
- SET CUR AT LOOK = Setze CUR auf LOOK
-
8A
-
- DECOMPRESSION = Dekomprimierung
- SET CUR TO THE START OF THE OUTPUT STRING = Setze CUR an den
Start des Ausgabestrings
- ARE ALL BYTES OF THE INPUT STRING PROCESSED? = Sind alle Bytes
des Eingabestrings verar beitet?
- No = Nein
- Yes = Ja
- END DECOMPRESSION = Ende der Dekomprimierung
- CHANGE THE EXPANSION SCHEME IF REQUIRED = Ändere das Expansionsschema,
wenn erfor derlich
- READ THE MARK BIT FROM THE INPUT STRING = Lese das MARK-Bit
von dem Eingabestring
- DOES MARK = 0? = Ist MARK = 0?
- Token reader module = Token-Lesemodul
- ARE ALL BYTES OF THE INPUT STRING PROCESSED = Sind alle Bytes
des Eingabestrings verar beitet
- READ THE NUMBER OF COMPRESSED BYTES MLEN BASED ON THE MLEN EXPANSION
SCHEME FROM THE INPUT STRING = Lese die Zahl der komprimierten Bytes
auf MLEN-Basis auf dem MLEN-Expansionsschema von dem Eingabestring
- READ OFFSET BASED ON THE OFFSET EXPANSION SCHEME FROM THE INPUT
STRING = Lese OFFSET basierend auf dem OFFSET-Expansionsschema von
dem Eingabestring
- FROM = von
-
8B
-
- FROM = von
- READ THE NUMBER OF NOT COMPRESSEN BYTES NCLEN BASED ON THE NCLEN
EXPANSION SCHEME FROM THE INPUT STRING = Lese die Zahl der nichtkomprimierten
Bytes auf NCLEN-Basis auf den NCLEN-Expansionsschema von dem Eingabestring
- TOKEN READER MODULE = Tokenlesemodul
- READ NCLEN BYTES FROM THE INPUT STRING AND COPY THEM TO THE
OUTPUT STRING AT CUR = Lese NCLEN Bytes von dem Eingabestring und
kopiere sie zu dem Ausgabestring bei CUR
- SUBSTRING COPIER MODULE = Unterstring-Kopiermodul
- SET CUR TO CUR + NCLEN = Setze CUR auf CUR + NCLEN
- SET PRE TO CUR-OFFSET = Setze PRE auf CUR-OFFSET
- READ MLEN BYTES IN OUTPUT STRING FROM PRE AND COPY THEM AT CUR
= Lese MLEN- Bytes
in Ausgabestring von Vorgänger
und kopiere sie bei CUR
- SET CUR TO CUR + MLEN = Setze CUR auf CUR + MLEN
-
9
-
- WRITE CTOKEN = Schreibe C-Token
- WAS THE PREVIOUS TOKEN A CTOKEN? = War der vorhergehende Token
ein C-Token?
- No = Nein
- Yes = Ja
- WRITE THE COMPRESSED STRING MARK (1) TO THE OUTPUT STRING =
Schreibe dekomprim ierte Stringmarke (1) zu dem Ausgabestring
- WRITE THE NUMBER OF MATCHING BYTES MLEN BASED ON THE MLEN EXPANSION
SCHEME TO THE OUTPUT STRING = Schreibe die Anzahl der übereinstimmenden
Bytes auf MLEN-Basis auf dem MLEN-Expansionsschema zu dem Ausgabestring
- WRITE THE DIFFERENCE (OFFSET) BETWEEN LOOK AND PRE BASED ON
THE OFFSET EX PANSION SCHEME TO THE OUTPUT STRING = Schreibe die
Differenz (OFFSETR) zwischen LOOK und PRE basierend auf dem OFFSET-Expansionsschema
zu dem Ausgabestring
- END WRITE CTOKEN = Ende des Schreibens des C-Token
-
10
-
- WRITE NCTOKEN = Schreibe NC-Token
- WRITE THE NOT COMPRESSED STRING MARK (0) TO THE OUTPUT STRING
= Schreibe die nicht- komprimierte
String-Marke (0) zu dem Ausgabestring
- WRITE THE DIFFERENCE (NCLEN) BETWEEN LOOK AND CUR BASED ON THE
NCLEN EXPAN SION SCHEME TO THE OUPUT STRING = Schreibe die Differenz
(NCLEN) zwischen LOOK und CUR basierend auf dem NCLEN-Expansionsschema
zu dem Ausgabestring
- WRITE ALL BYTES BETWEEN CUR AND LOOK TO THE OUTPUT STRING =
Schreibe alle Bytes zwischen CUR und LOOK zu dem Ausgabestring
- CHANGE EXPANSION SCHEME IF NECESSARY = Ändere Expansionsschema, wenn
erforderlich
- END WRITE NCTOKEN = Ende des Schreibens des NC-Token
-
11A
-
- SEARCH BEST MATCH LENGTH = Suche nach Best-Übereinstimmungs-Länge
- SET PSTRUCT TO THE POINTER AT INDEX IN THE LOOKUP TABLE AND
SET BESTMLEN = 0 = Setze PSTRUCT auf die Hinweismarke bei dem Index
in der Nachschlagetabelle und setze BESTMLEN = 0
- SET MLEN = 2 AND SET TMP TO THE VALUE OF THE INPUT STRING POINTER
OF PSTRUCT = Setze MLEN = 2 und setze TMP auf den Wert der Eingabestring-Hinweismarke
von PSTRUCT
- AT LEAST 1 CHARACTER LEFT BETWEEN LOOK + MLEN AND THE END OF
INPUT STRING? = Ist wenigstens ein Zeichen zwischen LOOK + MLEN
und dem Ende des Eingabestrings vorhanden?
- No = Nein
- Yes = Ja
- IS THE CHARACTER AT TMP + MLEN THE SAME AS THE ONE AT PRE +
MLEN? = Ist das Zeichen an TMP + MLEN das gleiche wie das bei PRE
+ MLEN?
- INCREMENT MLEN = Erhöhe
MLEN inkrementell
- FROM = von
- TO = zu
-
11B
-
- IS MLEN LONGER THAN BESTMLEN? = Ist MLEN länger als
BESTMLEN?
- No = Nein
- Yes = Ja
- SET BESTMLEN = MLEN AND SET PRE = TMP = Setze BESTMLEN = MLEN
und setze PRE = TMP
- IS THE POINTER TO THE PREVIOUS TRACKTAB SLOT OF PSTRUCT A NULL
POINTER? = Ist die Hinweismarke zu dem vorhergehenden Nachverfolgungstabellenschlitz
von PSTRUCT eine Null-Hinweismarke?
- SETMLEN = BESTMLEN = Setze MLEN = BESTMLEN
- SET PSTRUCT TO THE VALU OF THE TRACKTAB SLOT POINTER OF PSTRUCT
= Setze PSTRUCT auf den Wert der Nachfolgetabelleschitz-Hinweismarke
von PSTRUCT
- END SEARCH BEST MATCH LENGTH = Ende der Suche nach Best-Übereinstimmungs-Länge
- FROM = von
- TO = zu
-
12A
-
- TO = zu
- UPDATE LOOKUP TABLE AND TRACKTAB ARRAY = Mache Update von Nachschlagetabelle
und Nachverfolgungstabellenfeld
- SET MLENCP = MLEN = Setze MLENCP = MLEN
- MLENCP >1?
- DECREMENT MLENCP AND INCREMENT LOOK = Vermindere MLENCP inkrementell
und erhöhe
LOOK inkrementell
- EVALUATE INDEX = HASHFUNCTION (LOOK) = Ermittle Index = Hash-Funktion
(LOOK)
- INITIALIZE THE NEXT FREE TRACKTAB WITH THE POINTER LOOK AND
THE POINTER AT INDEX IN THE LOOKUP TABLE = Initialisiere die nächste freie
Nachverfolgungstabelle mit der Hinweismarke LOOK und die Hinweismarke
an dem Index in der Nachschlagetabelle
- PUT THE ADDRESS OF THIS TRACKTAB SLOT AT INDEX IN THE LOOKUP
TABLE = Füge
die Ad resse des Nachfolgetabellenschlitzes an den Index in die
Nachschlagetabelle ein
-
12B
-
- FROM = von
- EVALUATE INDEX + HASHFUNCTION (LOOK) = Ermittle Index + Hash-Funktion
(LOOK)
- POINTER AT INDEX IN LOOKUP TABLE POINTS TO A VALID TRACKTAB
SLOT? = Weist die Hin weismarke an dem Index in der Nachschlagetabelle
auf einen gültigen
Nachverfolgungstabellenschlitz hin?
- No = Nein
- Yes = Ja
- SET PRE TO THE INPUT STRING POINTER OF THE TRACKTAB SLOT POINTED
BY THE POIN TER AT INDEX IN THE LOOKUP TABLE = Setze PRE auf die
Eingabestring-Hinweismarke des Nachverfolgungstabellenschlitzes,
auf den durch die Hinweismarke an dem Index in der Nachschlage tabelle
hingewiesen wird
- IS THE CURRENT PAIR POINTED BY LOOK IDENTICAL TO THE ONE AT
PRE? = Ist das gegenwär
tige Paar, auf das durch LOOK hingewiesen wird, identisch mit dem
bei PRE?
- INITIALIZE THE NEXT FREE TRACKTAB SLOT WITH THE POINTER LOOK
AND THE POINTER AT INDEX IN THE LOOKUP TABLE = Initialisiere den
nächsten
freien Nachverfolgungstabellenschlitz mit der Hinweismarke LOOK
und der Hinweismarke an dem Index in der Nachschlagetabelle
- FILL THE NEXT FREE TRACKTAB SLOT WITH THE POINTER LOOK AS INPUT
STRING POINTER AND A NULL POINTER AS PREVIOUS TRACKTAB POINTER =
Fülle den
nächsten
freien Nachver folgungstabellenschlitz mit der Hinweismarke LOOK
als Eingabestring-Hinweismarke und eine Null- Hinweismarke als vorhergehende Nachverfolgungstabellenhinweismarke
- PUT THE ADDRESS OF THIS TRACKTAB SLOT AT INDEX IN THE LOOKUP
TABLE = Setze die Adresse dieses Nachfolgetabellenschlitzes an dem
Index in der Nachschlagetabelle
- INCREMENT LOOK = Erhöhe
LOOK inkrementell
- END UPDATE LOOKUP TABLE AND TRACKTAB ARRAY = Ende des Updates
der Nachschlagtabelle und des Nachverfolgungstabellenfeldes
-
13
-
- OFFSET = Versetz
- NCTPOKEN = NC-Token
- CTPOKEN = C-Token
- ASCII VALUE OF A = ASCII Wert von A