Inhalt

 


Menü Ausschalten

MEngelke.de / JavaScript / LZ77 Dynamic Compressor

Text-Converter

Suchen Drucken eMail 

Bitte JavaScript aktivieren!

Ohne Design Speichern


Beschreibung:

Mit diesem Tool können Sie Texte, HTML-Code und JavaScripte mit dem 40 Jahre alten LZ77-Algorithmus packen und wieder entpacken. Die Effizienz liegt bei etwa 40 bis 60 Prozent.
Für gepackten HTML-Code oder JavaScripte werden Decrunch-Header in JavaScript generiert, die den Code Automatisch entpacken und starten/anzeigen.

Source Import und Result Export:

Importieren kann man die zu packenden Daten entweder per Copy'n'Paste oder per Drag'n'Drop. Es wird automatisch eine CRC32 Checksumme erstellt, um zu überprüfen, ob der Import korrekt war.
Das fertige Result kann man entweder herunterladen oder per Copy'n'Paste heraus kopieren.

Zeichensatz:

Vor dem Import/Download hat man die Möglichkeit den Zeichensatz der Quelldatei zu bestimmen:

  • Auto - Daten werden als Binaer importiert mit automatischer UTF-8 Erkennung (Problematisch: ein UTF-8 Zeichen können auch mehrere Zeichen sein)
  • Data - Daten werden als Binaer importiert
  • Ansi - Daten werden als Text mit dem ISO-8859-1 Zeichensatz importiert
  • UTF-8 - Daten werden als Text mit dem UTF-8 Zeichensatz importiert

Pack-Methoden:

  • None / Minify - Nicht packen - Optional kann man den JavaScript-Code mit UglifyJS2 kürzen/optimieren lassen
  • LZ77-Static - Die Daten werden mit LZ77 gepackt und die gepackten Daten werden statisch gespeichert. (Feste Größe für die Positionsangaben der Redundanz) Für die 96-Tokens wird ein Zahlensystem gebildet, dass unseren Dezimalsystem ähnelt. (Nur mit 96 Zeichen, statt mit 10 Zahlen)
  • LZ77-Dynamic - Die Daten werden wie "LZ77-Static" mit LZ77 gepackt, aber die gepackten Daten werden dynamisch gespeichert. (Variable Größe für die Positionsangaben der Redundanz) Dabei wird für die 96-Tokens ein Zahlensystem ohne Redundanz verwendet (Beispiel für das Dezimalsystem: 0,1,2,3,4,5,6,7,8,9,00,01,02,03,04,05,06,07,08,09,10,11,12 ...) Zusätzlich werden für den Abstand und die Längenangaben der Redundanz unterschiedliche Kontroll-Token eingesetzt mit denen die Bandbreite der Angaben definiert wird.
  • LZ77-Dynamic Seq - Genau so wie "LZ77-Dynamic", nur zusätzlich mit Erkennung von Sequenzen (Bringt nur dann bessere Ergebnisse, wenn es viele und lange Unterschiedliche Sequenzen gibt)
  • LZ77-Dynamic Chain - Ebenfalls genau so wie "LZ77-Dynamic", wo zusätzlich gleiche Steuertokens (3 bis max. 23) zu einer Kette zusammen gefasst werden können. (Funktioniert nur bis Packstufe 6 - Je mehr Steuertokens es gibt, des so kürzer ist die Kette)

Packstufen:

LabelStufeTokensMax Buffer
Low13100
Medium279.316
High313894.052
Max42185.828.708
-/- 991699.823.827.
359.474.800

Dynamischer Modus mit Min. Buffer 5

  • Im Statischen Modus gibt es nur zwei verschiedene Packstufen: bis 100 (Einstellig - Nicht im Format: "Plain-Simple" verfügbar) und bis 9124 bzw. 9220 (Zweistellig für Abstand, Einstellig für Länge) die nur ein Statisches Steuertoken benötigen
  • Im Dynamischen Modus gibt es theoretisch 9 Packstufen, aber zum einen wird die Anzahl der Steuertoken von den insgesamt 96-Tokens zu hoch (d.H. die müssten alle entwertet werden) und zum anderen bricht irgendwann der Browser beim packen zusammen. Daher wird alles nach Stufe 3 unrealistisch.
  • Im Dynamischen-Sequenz oder Dynamischen-Chain Modus kommt noch ein weiterer Steuertoken für die Sequenz/Kette dazu, wo die Angaben für Sequenzlänge und Zeichenlänge oder der Kettenlänge nur Einstellig sind.

LZ77-Buffergrößen:

  • Min. Buffer - Die kleinstmögliche Redundanz. Änderungen können das Packergebnis verbessern oder verschlechtern. Bei einer Änderung, verkleinert/vergrößert sich auch der Max. Buffer der jeweiligen Packstufe (Der sinnvollste Wert ist: 5 und nicht im Format: "Plain-Simple" änderbar)
  • Max. Buffer - Die größtmögliche Redundanz und/oder der größtmögliche Abstand zur Redundanz. (Faustformel: Je höher der Wert, desso langer dauert das Packen und liefert ein besseres Ergebnis, aber die Effizienz sinkt langsam, aber stetig)
  • Low, Medium, High, Max stellen den Max. Buffer auf einen sinnvollen Wert.

Plain/HTML/JavaScript-Code:

Mit dieser Option wird für die gepackten HTML/JavaScript-Daten ein Entpackcode in JavaScript Generiert, der zwischen 130 Bytes und 404 Bytes groß sein kann. (Abhängig von Packart, Buffergröße und Browserkompatibilität)
Folgende Unteroptionen stehen zur Verfügung:

  • Plain, HTML und JavaScript - Die zupackenden Daten als Daten (RAW-Data), HTML-Code (Nur Ausgabe) oder JavaScript-Code (Ausführen) interpretieren
  • Small und Universal - Hiermit bestimmen Sie, ob der Decrunch-Header möglichst kurz oder Kompatible zu älteren Browsern sein soll
  • Eval und Write - Damit bestimmen Sie, wie der entpackte Code gestartet werden soll. (Im HTML-Modus ist Eval nicht möglich)
  • Minify und Optimize - Bevor der JavaScript-Code gepackt wird, kann er mit UglifyJS2 gekürzt oder optimiert werden
  • Escape UTF-8 - Sollte der HTML/JavaScript-Code UTF-8-Zeichen enthalten, die Probleme beim entpacken machen, können diese hiermit Maskiert/Entwertet werden
  • Control Chars - Mit dieser Option können Schwierige Zeichen (' " \) mit Steuerzeichen ersetzt werden. Je nach häufigkeit, kann der gepackte Code nochmal verkürzt werden.

Bedienelemente:

  • Pack - Packt die Daten im Source-Feld. Das fertige Ergebnis wird in Result ausgegeben.
  • Unpack - Entpackt die Daten im Result/Source-Feld. Das fertige Ergebnis wird in Result ausgegeben bzw überschrieben. (Es können auch einige Fremd Decrunch-Header entpackt werden)
  • Test - Entpackt die gepackten Daten im Result-Feld und vergleicht diese mit dem Source-Feld. (Source und Result bleiben unverändert und diese Funktion kann man nicht zusammen mit Minify oder Optimize verwenden)
  • Download - Die Daten im Result-Feld können heruntergeladen werden. (Das Charset wird beim Download beachtet)
  • Reset - Setzt alle Bedienelemente wieder zurück.
  • Choose File - Für ältere Browser, die kein Drag'n'Drop unterstützen.

Plain-Formate:

  • Plain-Simple
    • Zuerst werden alle Steuertoken ausgegeben
    • als Endmarkierung nochmal das erste Token
    • und dann die gepackten Daten
  • Plain-Clear
    • Zuerst kommt ein Tabulator-Code (0x09)
    • dann alle Steuertoken
    • nochmal das erste Token
    • ein kodierter Token für Packstufe und MinBuffer
    • Weitere kodierte Tokens für weitere Optionen oder Packmethoden
    • ein Tabulator-Code (0x09) als Endmarkierung
    • und dann die gepackten Daten
  • Plain-Quoted (Identisch mit Plain-Clear als String für JavaScript kodiert)
 

unlz77.js.gz - Beispiel Quelltext zum entpacken der Plain-Header von LZ77-Dynamic

Browser Benchmark: (Packen & Entpacken)

Test-Rechner: Lenovo ThinkPad SL510 unter Windows 10 (Prozessor: Intel Mobile Core 2 Duo T6670 2.2GHz)
Test-Datei: jquery-3.2.1.min.js 86.659 Bytes (CRC32: 1413FF29)
LZ77 Dynamic Compressor Version: 1.5 (03.09.2017)

 
BrowserVersionStatic 100Static 9220Dynamic 100Dynamic 9316Dynamic 894052
Edge (1)38.14393.0.01.6 s0.4 s58 s1.0 s1.6 s0.4 s98 s0.9 s202 s1.1 s
Internet Explorer (1)11.1593.14393.01.4 s0.4 s48 s1.0 s2.5 s0.4 s87 s1.1 s316 s1.2 s
Iron60.0.3150.00.7 s0.3 s24 s0.4 s0.8 s0.2 s22 s0.4 s79 s0.4 s
Firefox (1)55.0.31.2 s0.1 s30 s0.1 s1.1 s0.1 s32 s0.1 s112 s0.1 s
Google Chrome60.0.3112.1130.9 s0.3 s22 s0.4 s0.9 s0.3 s23 s0.4 s79 s0.4 s
K-Meleon (1)75.11.5 s0.2 s33 s0.2 s1.1 s0.2 s33 s0.2 s116 s0.2 s
Opera47.2631.550.9 s0.3 s24 s0.4 s0.9 s0.3 s22 s0.4 s77 s0.4 s
QupZilla2.1.20.7 s0.2 s21 s0.4 s0.8 s0.2 s21 s0.4 s71 s0.4 s
Gepackte Größe von jquery-3.2.1.min.js70.985 B50.834 B70.505 B48.061 B45.710 B
 
  1. Unterstützt keine Fortschrittsanzeige in der Titelleiste
 

Anmerkungen: (Stand: September 2017)
Beim Packen ist QupZilla fast immer der schnellste. (Dicht gefolgt von Chromium / Google Chrome / Iron)
Doch beim entpacken ist Firefox deutlich und mit großen abstand der schnellste. (Ganz besonders bei großen Dateien)
Edge und Internet Explorer sind unter Windows 10 immer noch die langsamsten.

Danksagungen:

  • packer - Vermutlich einer der ersten JavaScript-Kompressoren
  • lz77js - Ein weiterer LZ77-Packer (Mit eigenen Decrunch-Header)
  • lz77 - Noch ein LZ77-Packer mit Quelltext (Hat ein Bug: Window length geht nicht fehlerfrei über 6148 hinaus)
  • lz77-kit - Verschiedene Quelltexte zum LZ77-Packer in einigen Programmiersprachen
  • lz77-datenkompression - Ein Video über LZ77-Kompression in Deutsch

Programmgeschichte:

v1.6 (20.09.2017)

  • Bug: Dateiname wurde beim Download nicht angepasst
  • NEU: Chain-Modus Packt eine Kette von gleichen Token oder Zeichen zusammen
  • Im Statischen Modus wird versucht ein ASCII-Token zu benutzen
  • Im Source-Feld können Optional Tabs (0x09) direkt eingegeben werden
  • Beep-Ton ertönt nur nach einer längeren Arbeitszeit
  • Parsen von Binaer-Code ermöglicht (Macht nur keinen Sinn)
  • Fortschrittsanzeige weiter verbessert

v1.5 (03.09.2017)

  • Bug: Mindestlänge wurde bei LZ77-Kompression nie gefunden, wenn distance 0 war (Packt jetzt minimal besser)
  • Bug: Sequenz hatte eine Mögliche Redundanz direkt danach verschluckt
  • Bug: Es wurde für Distance kein Token Generiert, wenn der Wert 0 war
  • Bug: ParseHeader hat teilweise undefinierte Werte zurückgegeben
  • Neuer Universal-Header (Bis zu 39 Bytes kürzer)
  • Neuer Plaintext-Header mit Erweiterten Daten für MinBuf und MaxBuf
  • Auto-UTF8 Erkennung verbessert (Es wird nur dann UTF8 erkannt, wenn ausschließlich UTF8-Zeichen vorkommen)
  • GUI an den Neuerungen angepasst
  • MinBuffer in der GUI von 2 bis 12 auswählbar

v1.4 (13.07.2017)

  • Viele kleine Verbesserungen vorgenommen
  • Download-Charset änderbar
  • Eigene Decrunch-Header werden direkt wieder erkannt
  • Konvertierungen von Decrunch-Headern erweitert
  • Entpacken mit Fortschrittsanzeige
  • Optionales Beep nach (Ent-)Packen

v1.3 (17.06.2017)

  • Anzeige, welcher Charset beim importieren erkannt wurde
  • HTML-Modus hinzugefügt (Packt eine komplette HTML-Seite mit Decrunch-Header)

v1.2 (20.11.2016)

  • Download nun mit ANSI-Kodierung möglich

v1.1 (11.11.2016)

  • Auto-Charset Erkennung bei Drag'n'Drop
  • Drag'n'Drop/Upload erlaubt unbekannte Dateitypen
  • Fortschrittsanzeige verbessert
  • Zeitanzeige wird beim Testen angegeben

v1.0 (05.11.2016)

  • Erste öffentliche Version

 << Humor | Home | Kategorie >><< Kennwortschutz | Java Script | Text-Converter >>