Diese Dokumentation erklärt hauptsächlich die Probleme mit den archivierten Dateidaten
in LZX-Archiven wegen des Y2K-Bugs (Jahr 2000 Programmfehler) und wie das LZX-Plugin für Total
Commander seit V2.0 diesen handhabt. Diese Dokumentation wurde zuletzt modifiziert am 25.10.2006.
Für eine englische Version von diesem Dokument siehe LZX date problem handling with the LZX plugin for Total Commander.
Diese Dokumentation ist Teil des Archivs lzx_plugin.zip verfügbar auf der Pluginseite der Website von Total Commander.
Um Dateien von Archiven erzeugt mit LZX - einem populärem AMIGA Packformat - mit Total Commander zu entpacken, hat Sebastian Erbert ein Packer-Plugin geschrieben. Aber die letzte Version 1.1 von diesem Plugin von Sebastian behandelt den Monat von den archivierten Dateien nicht korrekt.
Die letzte freigegebene V1.21 von LZX für den AMIGA hat einen wirklich schlimmen Y2K-Bug. Dieser
Programmfehler hat keinen Einfluss auf die Zeit und den Tag des Datums von archivierten Dateien. Aber es
gibt viele Probleme mit dem Monat und dem Jahr von archivierten Dateien wegen des Y2K-Bugs von LZX V1.21
(Aminet: lzx121r1.lha in util/arc) und den zwei unterschiedlichen Patches (Fehlerbehebungen), die es
für diesen Bug (Programmfehler) gibt.
Patch 1: | LZX_Y2Kfix.lha | (util/arc) geschrieben von Andrey Titov aka dr.Titus |
Patch 2: | LZX121r_pch.lha | (util/arc) geschrieben von Mikolaj Calusinski |
Mehr LZX-Material und Informationen kann man auf The LZX Page by Jonathan Forbes and Tomi Poutanen finden. Diese Webseite ist von den Autoren des LZX-Kompressionsalgorithmus und den originalen LZX-Programmen.
Um alle Datumsprobleme zu lösen, wurde das Plugin verbessert und V2.0 des Plugins handhabt nun
das Datum von den archivierten Dateien mit der Hilfe des Anwenders korrekt. Diese Dokumentation beschreibt
im Detail, was die Probleme mit den Daten von archivierten Dateien sind und was ein Anwender tun sollte,
um die korrekten Dateidaten während dem Entpacken eines LZX-Archives zu erhalten.
Hinweis: | Total Commander verwendet die FAT Dateizeit, welche ungerade Sekunden nicht handhaben kann (eliminiert Bit 0). Nur die NTFS Präzisionszeit kann auch ungerade Sekunden speichern. Daher sieht man immer nur gerade Sekundenwerte (00, 02, 04, ...) in den Dateilistenanzeigen von Total Commander und niemals ungerade Sekundenwerte (01, 03, 05, ...). Das Plugin speichert die entpackten Dateien immer mit der Präzisionszeit. Windows wandelt diese automatisch in FAT Zeit um, wenn dies notwendig ist. |
Alle Monate von archivierten Dateien werden mit dem LZX-Plugin V1.1 mit Werten 0-11 anstelle von 1-12 angezeigt, weil LZX den Monat mit einem Wert 0-11 speichert, aber Total Commander (Windows) 1-12 benötigt. Dieser Programmfehler wurde in V2.0 des LZX-Plugins behoben.
Siehe auch das Problem mit Jahreswerten, welche auch Bit 0 des Monatswertes setzen (Problem 4) und wie die Y2K-Patches Monat und Tag von archivierten Dateien handhaben.
Ein Beispiel zur Veranschaulichung:
Archiv: | lzx_test_unpatched.lzx |
Datei: | LZX_Test\1978\1978-01-31.txt |
Datum: | 31.01.1978 00:00:00 |
Datumswert innerhalb des Archivs: 0xF8100000
Der Datumswert im binären Format:
1111 1 | 000 0 | 001 000 | 0 0000 | 0000 00 | 00 0000 |
Tag | Mon. | Jahr | Stunde | Min. | Sek. |
Bit 05...00 - 6 Bits - Sek. | = 0x00 | = 00 |
Bit 11...06 - 6 Bits - Min. | = 0x00 | = 00 |
Bit 16...12 - 5 Bits - Stu. | = 0x00 | = 00 |
Bit 22...17 - 6 Bits - Jahr | = 0x08 | = 08 (+1970) |
Bit 26...23 - 4 Bits - Mon. | = 0x00 | = 00 (+1) |
Bit 31...27 - 5 Bits - Tag | = 0x1F | = 31 |
Die Datumswerte im Archiv sind korrekt, aber das Datum wird als 31.00.2106 von V1.1 des
LZX-Plugins angezeigt.
Ursache: Windows verwendet 1980 als Basisjahr. Daher sind Daten vor 1980 in
der Windows-Umgebung nicht möglich (außer mit NTFS Präzisionszeit). In der
Total Commander Struktur für das Datum und die Zeit von archivierten Dateien ist der
Jahreswert mit den Bits 25...31 (7 Bits) in einem 32 Bit-Wert gespeichert.
Bei der Berechnung ((1978 - 1980) << 25) >> 25) + 1980 wird das falsche Resultat 2106 erzeugt, weil
-2 = 0xFFFFFFFE, 25 mal geschoben = 0x7E = 126, + 1980 = 2106 ist. Das ist
bei V2.0 des LZX-Plugins behoben, indem die Jahreswerte 1978 und 1979 immer auf 1980 gesetzt werden. Es
kann angenommen werden, dass es nicht viele Dateien in LZX-Archiven gibt, welche tatsächlich von
1978 oder 1979 sind.
Hinweis: | Basisjahr für das AMIGA Betriebssystem ist 1978, für LZX 1970 und für Windows 1980! |
Diese Version von LZX von Jonathan Forbes speichert Jahreswerte nach 1999 nicht korrekt. Der
LZX-Kompressionsquellcode ist nicht frei, sodass der Autor dieses Dokumentes keine exakte Information
hat, was die falschen Werte für Jahreswerte größer 1999 verursacht. Folgende Werte werden
vom nicht "geflickten" (fehlerbehobenen, reparierten) LZX V1.21 im Archiv gespeichert.
Jahr | gespei. Wert | korrekt wäre |
2000 | ........ 58 ........ | 30 |
2001 | ........ 59 ........ | 31 |
2002 | ........ 60 ........ | 32 |
2003 | ........ 61 ........ | 33 |
2004 | ........ 62 ........ | 34 |
2005 | ........ 63 ........ | 35 |
Das schaut wie diese Formel aus: (((Jahr % 100) | 0x80) - 70) & 0x7F
Die Unlzx-Routine des LZX-Plugins V1.1 addiert immer einfach 1970 zum im Archiv gespeicherten
Jahreswert. Das ergibt die falschen Jahre 2028-2033 anstelle von 2000-2005.
Hinweis: | Das ist nicht wirklich ein Programmfehler des Plugins V1.1. Es ist ein Bug der LZX-Kompressionsroutine! |
Ein Beispiel zur Veranschaulichung:
Archiv: | lzx_test_unpatched.lzx |
Datei: | LZX_Test\2000\2000-01-31.txt |
Datum: | 31.01.2000 00:00:00 |
Datumswert innerhalb des Archivs: 0xF8740000
Der Datumswert im binären Format:
1111 1 | 000 0 | 111 010 | 0 0000 | 0000 00 | 00 0000 |
Tag | Mon. | Jahr | Stunde | Min. | Sek. |
Bit 22...17 - 6 Bits - Jahr | = 0x3A | = 58 (+1970) - falscher Wert |
Bit 26...23 - 4 Bits - Mon. | = 0x00 | = 00 (+1) |
Bit 31...27 - 5 Bits - Tag | = 0x1F | = 31 |
Falsch berechnetes Jahr: 2028 statt 2000.
Siehe das Kapitel Handhabung, welches beschreibt, wie das Plugin V2.0 die Monats- und Jahreswerte von archivierten Dateien gemäß dem verwendeten Packer handhabt, um das Jahr korrekt zu dekodieren.
Bei konsequenter Verwendung der vermuteten Formel von Problem 3 für Jahreswerte größer 2005 wird eine Rückkehr zum Basisjahr 1970 erzeugt, bei dem Bit 0 vom Monat immer gesetzt wird, da der Jahreswert nun immer größer 63 ist. Das Jahr würde somit 7 Bits benötigen. Dieses Jahrbit im Monatsfeld resultiert in immer geraden Monatswerten, was Andrey Titov "six-month count system" (Sechs-Monat-Zählsystem) nannte.
Beispiel:
Archiv: | lzx_test_unpatched.lzx |
Datei: | LZX_Test\2006\2006-01-31.txt |
Datum: | 31.01.2006 00:00:00 |
Datumswert innerhalb des Archivs: 0xF8800000
Der Datumswert im binären Format:
1111 1 | 000 1 | 000 000 | 0 0000 | 0000 00 | 00 0000 |
Tag | Mon. | Jahr | Stunde | Min. | Sek. |
Bit 22...17 - 6 Bits - Jahr | = 0x00 | = 00 (+1970) | - falscher Wert |
Bit 26...23 - 4 Bits - Mon. | = 0x01 | = 01 (+1) | - falscher Wert |
Bit 31...27 - 5 Bits - Tag | = 0x1F | = 31 |
Wegen des Problems mit dem Basisjahr 1980 und dem Monatsproblem wird das Dateidatum 31.01.2006 als 28.01.2098 mit Plugin V1.1 angezeigt.
Es ist möglich die Jahreswerte bis zum Jahr 2013 durch Addition von 2006 für LZX-Archive erzeugt mit einem nicht fehlerbehobenen Packer zu korrigieren, da auf einem AMIGA kein Jahreswert kleiner 1978 möglich ist. Für jede Datei mit Jahr 2014 oder größer gespeichert in einem Archiv erzeugt mit dem nicht fehlerbehobenen LZX V1.21 kann das Jahr nicht korrekt identifiziert werden und wird somit falsch behandelt.
Aber der Monatswert von Dateien mit einem Jahreswert größer 2005 kann nur automatisch für ungültige Datumsangaben ausgebessert werden, z.B. wird 31.02.2006 vom Plugin V2.0 auf 31.01.2006 korrigiert. Aber wenn das Datum für den falschen Monat möglich ist, kann das Plugin den korrekten Wert des Monats nicht bestimmen wie zum Beispiel für 2012-07-31.txt, welche angezeigt oder entpackt wird mit dem Datum 2012-08-31.
Wenn auch noch das Basisjahrproblem berücksichtigt wird, können LZX-Archive erzeugt mit der nicht fehlerbehobenen V1.21 vom LZX-Plugin 100% korrekt nur im Bereich 01.01.1980 bis 31.12.2005 gehandhabt werden.
Auf The LZX Page oder im Aminet sind auch 2 verschiedene Patches (Programmkorrekturen) verfügbar, welche das Y2K-Problem von LZX V1.21 beheben.
Zuerst wird der Patch von Andrey Titov aka dr.Titus analysiert.
Im Bereich von 01.01.1978 bis 31.12.2005 erzeugt es exakt das gleiche Ergebnis wie das nicht fehlerbehobene LZX V1.21.
Beginnend mit Jahr 2006 wird der Jahreswert im Vergleich zur nicht fehlerbehobenen V1.21 anders gespeichert. Dieser Patch ändert das Basisjahr für alle Jahreswerte größer 2005 auf 1976. Dadurch korrigiert es die Ergebnisse bis zum Jahr 2033 (die Werte im Archiv sind 30-57). Der Bereich von 2034 bis 2041 wird im Archiv mit einem Jahreswert von 0-7 gesichert. Berücksichtigt man, dass ein Jahr vor 1978 auf einem AMIGA nicht möglich ist, kann dies erkannt und durch Addition von 2034 zu einem Jahreswert kleiner als 8 korrekt dekodiert werden.
Beispiel 1:
Archiv: | lzx_test_titov.lzx |
Datei: | LZX_Test\2006\2006-01-31.txt |
Datum: | 31.01.2006 00:00:00 |
Datumswert innerhalb des Archivs: 0xF83C0000
Der Datumswert im binären Format:
1111 1 | 000 0 | 011 110 | 0 0000 | 0000 00 | 00 0000 |
Tag | Mon. | Jahr | Stunde | Min. | Sek. |
Bit 22...17 - 6 Bits - Jahr | = 0x1E | = 30 (+1976) |
Bit 26...23 - 4 Bits - Mon. | = 0x00 | = 00 (+1) |
Bit 31...27 - 5 Bits - Tag | = 0x1F | = 31 |
Beispiel 2:
Archiv: | lzx_test_titov.lzx |
Datei: | LZX_Test\2034\2034-11-30.txt |
Datum: | 30.11.2034 00:00:00 |
Datumswert innerhalb des Archivs: 0xF5000000
Der Datumswert im binären Format:
1111 0 | 101 0 | 000 000 | 0 0000 | 0000 00 | 00 0000 |
Tag | Mon. | Jahr | Stunde | Min. | Sek. |
Bit 22...17 - 6 Bits - Jahr | = 0x00 | = 00 (+2034) |
Bit 26...23 - 4 Bits - Mon. | = 0x0A | = 10 (+1) |
Bit 31...27 - 5 Bits - Tag | = 0x1E | = 30 |
Wie jedermann sehen kann behebt der Patch von Titov auch das Monatsproblem. Somit enthält ein LZX-Archiv erzeugt mit dem Patch von Titov immer das korrekte Dateidatum im gesamten Bereich von 01.01.1978 00:00:00 bis 31.12.2041 23:59:59. Aber die Unlzx-Routine muss wissen, dass das LZX-Archiv mit LZX V1.21 fehlerbehoben mit dem Patch von Titov erzeugt wurde, um das Datum korrekt zu dekodieren.
Der zweite Y2K-Patch für LZX V1.21 auf The LZX Page oder im Aminet ist von Mikolaj Calusinski. Dieser Patch berechnet die Jahreswerte innerhalb des Archivs wie jeder es erwarten würde. Ein Jahr von 2000 bis 2033 wird mit einem Wert von 30 bis 63 gespeichert. Somit wird das richtige Ergebnis durch eine einfache Addition von 1970 während dem Entpacken erzeugt. Die Jahre 2034 bis 2041 werden mit den Werten 0-7 wie beim anderen Patch von Titov gesichert. Daher können diese auch dekodiert werden, indem man 2034 zu diesen Werten addiert.
Beispiel 1:
Archiv: | lzx_test_calusinski.lzx |
Datei: | LZX_Test\2000\2000-01-31.txt |
Datum: | 31.01.2000 00:00:00 |
Datumswert innerhalb des Archivs: 0xF83C0000
Der Datumswert im binären Format:
1111 1 | 000 0 | 011 110 | 0 0000 | 0000 00 | 00 0000 |
Tag | Mon. | Jahr | Stunde | Min. | Sek. |
Bit 22...17 - 6 Bits - Jahr | = 0x1E | = 30 (+1970) |
Bit 26...23 - 4 Bits - Mon. | = 0x00 | = 00 (+1) |
Bit 31...27 - 5 Bits - Tag | = 0x1F | = 31 |
Es gibt kein Problem mit dem Monatswert für alle Jahre bis 2034. Aber Dateien mit einem Jahr 2034 bis 2041 haben auch das Monatsproblem 04 - Bit 0 vom Monat ist immer gesetzt wie Mikolaj Calusinski es auch in der Readme von seinem Patch erwähnt und folgendes Beispiel demonstriert.
Beispiel 2:
Archiv: | lzx_test_calusinski.lzx |
Datei: | LZX_Test\2034\2034-11-30.txt |
Datum: | 30.11.2034 00:00:00 |
Datumswert innerhalb des Archivs: 0xF5800000
Der Datumswert im binären Format:
1111 0 | 101 1 | 000 000 | 0 0000 | 0000 00 | 00 0000 |
Tag | Mon. | Jahr | Stunde | Min. | Sek. |
Bit 22...17 - 6 Bits - Jahr | = 0x00 | = 00 (+2034) | |
Bit 26...23 - 4 Bits - Mon. | = 0x0B | = 11 (+1) | - falscher Wert |
Bit 31...27 - 5 Bits - Tag | = 0x1E | = 30 |
Um die Dateidaten von den archivierten Dateien richtig zu behandeln, muss das Plugin wissen, welche Version von LZX es erzeugt hat. Das Plugin ist nicht fähig den Packer selbst zu erkennen, weil es keine zusätzliche Information über den Packer im Archiv gibt.
Das Plugin V2.0 liest von einer INI-Datei die Information, welche Routine verwendet werden soll, um die Datumsangaben der archivierten Dateien zu dekodieren. Der Anwender kann die Einstellung in der INI-Datei mit einem Textbearbeitungsprogramm wie Notepad ändern. Die Einstellung wird von der INI-Datei bei jedem Öffnen eines LZX-Archivs gelesen. Siehe INI-Einstellungen des LZX-Plugins für Details über die INI-Datei.
Nachdem das Jahr gemäß der Einstellung in der INI-Datei bestimmt wurde, wird immer das gesamte Datum auf ein ungültiges Datum geprüft. Falls der Tag des Monats für den aktuellen Monat nicht gültig ist und der Monat ist größer als 1 (Januar/Jänner), wird der Monat um den Wert 1 verringert - siehe Problem 4 - und die Prüfung wird noch einmal durchgeführt. Wenn der Tag immer noch nicht gültig ist, wird der Monat vom Archiv verwendet und der Tag wird auf den letzten Tag dieses Monats gesetzt. Die Schaltjahrregel wird für den Februar angewandt.
Mit dieser Einstellung, welche auch die Standardeinstellung ist, dekodiert das Plugin V2.0
das Jahr und den Monat von archivierten Dateien wie folgt:
Mit der Einstellung LZXPacker=0 werden die Datumsangaben von archivierten
Dateien für folgende Datumsbereiche 100% korrekt dekodiert:
Archiv erstellt mit einem Original-LZX: | 01.01.1980 ... 31.12.2005 |
Archiv erstellt mit Titov reparierten LZX: | 01.01.1980 ... 31.12.2005 |
Archiv erstellt mit Calusinski reparierten LZX: | 01.01.1980 ... 31.12.2027 |
Archivierte Dateien aus dem Jahr 1978 oder 1979 werden mit richtigem Tag und Monat dekodiert,
aber das Jahr wird auf 1980 gesetzt.
Möglicherweise haben archivierte Dateien gepackt
mit einem nicht fehlerbehobenen LZX im Jahresbereich 2006 bis 2013 einen falschen Monat in der
Dateianzeige oder nach dem Entpacken.
Diese Dokumentation wurde im Oktober 2006 geschrieben. Hoffentlich gibt es niemanden mehr, der eine nicht reparierte Originalversion von LZX auf einem AMIGA für aktuelle Dateien verwendet.
Mit dieser Einstellung dekodiert das Plugin V2.0 das Jahr und den Monat von archivierten
Dateien wie folgt:
Mit der Einstellung LZXPacker=1 werden die Datumsangaben von archivierten
Dateien für folgende Datumsbereiche 100% korrekt dekodiert:
Archiv erstellt mit einem Original-LZX: | 01.01.1980 ... 31.12.2005 |
Archiv erstellt mit Titov reparierten LZX: | 01.01.1980 ... 31.12.2041 |
Archiv erstellt mit Calusinski reparierten LZX: | 01.01.1980 ... 31.12.1999 |
Archivierte Dateien aus dem Jahr 1978 oder 1979 werden mit richtigem Tag und Monat dekodiert, aber das Jahr wird auf 1980 gesetzt. Archive erstellt mit LZX mit dem Patch von Andrey Titov und entpackt mit diesem Plugin V2.0 mit der Einstellung LZXPacker=1 haben kein Monatsproblem im vollen Jahresbereich von 1978 bis 2041.
Mit dieser Einstellung dekodiert das Plugin V2.0 das Jahr und den Monat von archivierten
Dateien wie folgt:
Mit der Einstellung LZXPacker=2 werden die Datumsangaben von archivierten
Dateien für folgende Datumsbereiche 100% korrekt dekodiert:
Archiv erstellt mit einem Original-LZX: | 01.01.1980 ... 31.12.1999 |
Archiv erstellt mit Titov reparierten LZX: | 01.01.1980 ... 31.12.1999 |
Archiv erstellt mit Calusinski reparierten LZX: | 01.01.1980 ... 31.12.2033 |
Archivierte Dateien aus dem Jahr 1978 oder 1979 werden mit richtigem Tag und Monat dekodiert,
aber das Jahr wird auf 1980 gesetzt.
Möglicherweise haben archivierte Dateien gepackt
mit LZX mit Patch Mikolaj Calusinski im Jahresbereich 2033 bis 2041 einen falschen Monat in der
Dateianzeige oder nach dem Entpacken. Aber momentan (Oktober 2006) ist dies nicht wirklich
ein Problem und sehr wahrscheinlich wird es nie ein Problem werden.
Das Archiv lzx_source.zip auf der Pluginseite von Total Commander enthält die 3 Testarchive, welche hier in dieser Dokumentation einige Male erwähnt werden. Es enthält auch die AMIGA Skriptdatei zum Erzeugen der LZX-Testarchive.
Jean-Francois FABRE, Autor von JST, hat auch LZX V1.21 (nicht fehlerbehoben oder mit Titov's Patch) für seine JST-Slaves verwendet. Somit muss dieses Plugin mit der Einstellung LZXPacker=0 oder =1 verwendet werden, um auch das Datum vieler archivierter Dateien für JST korrekt zu entpacken. Man kann die LZX-Archive für den HD-Installer JST von The JOTD Patch & HD Installers Page herunterladen.
Das populäre Festplatteninstallationsprogramm für AMIGA Demos und Spiele WHDLoad ist als LZX-Paket und auch als LhA-Paket verfügbar, was gut zum Testen des Plugins ist. Diese Archive enthalten auch Dateien mit Dateikommentaren.