Das Microsoft FAT-Dateisystem verfügt über eine Verzeichnistabelle, die angibt, welche "Dateien" sich in welchen "Ordnern" auf der Festplatte befinden. Für die Zeit haben diese Einträge viele Informationen in eine kleine Menge von Bits gepackt. Es gibt eine Reihe von technischen Spezifikationen im Wiki für Neugierige, aber die Herausforderung hier wird sich auf eine "einfache" Dekodierung eines Eintrags konzentrieren.
Jeder Eintrag besteht aus einem 32-Byte-Binärwort, das in mehrere Abschnitte unterteilt ist. Aus Konsistenzgründen verwenden wir die MS-DOS 5.0-Version, die Bytes sind als Big Endian geordnet und wir nennen Byte ganz 0x00
links und Byte ganz 0x1F
rechts.
Nachfolgend finden Sie eine kurze schematische Darstellung der relevanten Abschnitte und die Ausgabe für jeden Abschnitt (in Fettdruck ).
- Die ersten 11 Bytes sind der Dateiname im ASCII-Format (hierher kommt der berühmte 8.3-Dateiname - 8 Bytes für den Dateinamen, 3 Bytes für die Erweiterung). Dies ist eine reine ASCII-Codierung und sollte als ASCII mit einem Punkt (.) Dazwischen ausgegeben werden .
- Hinweis: Sowohl die 8- als auch die 3-Teile sind mit Leerzeichen aufgefüllt, um eine Eingabe in voller Länge zu ermöglichen. Die Ausgabe sollte Leerzeichen ignorieren (dh nicht ausgeben).
- Die Dateierweiterung kann leer sein (dh alle Leerzeichen). In diesem Fall sollte die Ausgabe nicht den Punkt ausgeben .
- Da ASCII nur die unteren 7 Bits verwendet, werden die Bytes alle vorangestellt
0
.
- Das nächste Byte (0x0b) ist eine Bitmaske der folgenden Art:
- 0x01 Read Only - RO ausgeben
- 0x02 Hidden - Ausgabe von H
- 0x04 System - Ausgang S
- 0x08 Volume Label - Ausgabe VL . Die Dateigröße (unten) sollte unabhängig von ihrem tatsächlichen Eintrag als 0 ausgegeben werden .
- 0x10-Unterverzeichnis - SD ausgeben . Die Dateigröße (unten) sollte unabhängig von ihrem tatsächlichen Eintrag als 0 ausgegeben werden .
- 0x20 Archiv - Ausgabe A
- 0x40 Gerät - für diese Herausforderung ignoriert.
- 0x80 Reserviert - für diese Herausforderung ignoriert.
- Da dies eine Bitmaske ist, sind mehrere Flags möglich - alle zutreffenden Ausgaben sollten in beliebiger Reihenfolge miteinander verkettet werden. Zum Beispiel
0xff
könnte es seinROHSVLSDA
(oder irgendeine andere Kombination).
- Die nächsten zwei Bytes (0x0c und 0x0d) werden unter MS-DOS 5.0 nicht verwandt.
- Die nächsten zwei Bytes (0x0e und 0x0f) sind die Erstellungszeit wie folgt:
- Die Bits 15 bis 11 sind die Stunden im 24-Stunden-Format - Ausgabe 00 bis 23
- Die Bits 10 bis 5 sind die Minuten - Ausgabe 00 bis 59
- Die Bits 4 bis 0 sind die Sekunden / 2 - Ausgabe von 00 bis 58 (beachten Sie, dass die Sekunden nur eine Auflösung von zwei Sekunden haben).
- Zur Verdeutlichung:
hhhhhmmmmmmsssss
wenn Big-Endian geschrieben.
- Die nächsten zwei Bytes (0x10 und 0x11) sind das Erstellungsdatum wie folgt:
- Die Bits 15 bis 9 geben die Jahresausgabe 1980 für
0
bis zu 2107 für an127
- Bits 8 bis 5 sind die Monate - Ausgabe 1 bis 12 (mit oder ohne führende Null)
- Bits 4 bis 0 sind der Tag - Ausgabe 0 bis 31 (mit oder ohne führende Null)
- Zur Verdeutlichung:
yyyyyyymmmmddddd
wenn Big-Endian geschrieben.
- Die Bits 15 bis 9 geben die Jahresausgabe 1980 für
- Die nächsten zwei Bytes (0x12 und 0x13) sind das letzte Zugriffsdatum. Wir ignorieren diesen Teil für diese Herausforderung, während wir in MS-DOS 5.0 verwandt werden.
- Die nächsten zwei Bytes (0x14 und 0x15) werden von MS-DOS 5.0 nicht verwandt.
- Die nächsten zwei Bytes (0x16 und 0x17) sind die letzte geänderte Zeit und folgen demselben Format wie die oben angegebene Erstellungszeit.
- Die nächsten zwei Bytes (0x18 und 0x19) sind das letzte Änderungsdatum und folgen demselben Format wie das Erstellungsdatum oben.
- Die nächsten zwei Bytes (0x1a und 0x1b) sind der Cluster-Speicherort der Datei auf der Festplatte. Wir ignorieren diesen Teil für diese Herausforderung.
- Die letzten vier Bytes (0x1c, 0x1d, 0x1e und 0x1f) stellen die Dateigröße dar - werden als Ganzzahl ohne Vorzeichen ausgegeben , sofern nicht die VL- oder SD- Flags gesetzt sind ( siehe oben). In diesem Fall wird ausgegeben
0
.
Visuelle Darstellung
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
\______________________________FILENAME________________________________________________/\_ATTR_/\___NOTUSED____/\_CREATIONTIME_/\_CREATIONDATE_/\__LASTACCESS__/\___NOTUSED____/\_MODIFIEDTIME_/\_MODIFIEDDATE_/\___NOTUSED____/\___________FILESIZE___________/
Eingang
- Ein einzelnes 32-Byte-Wort (dh 256 Bit) in einem beliebigen Format.
- Dies kann eine Zeichenfolge von
1
und0
, wie mehrere vorzeichenloseint
, ein Array von Booleschen Werten usw. sein. - Bitte geben Sie in Ihrer Antwort an, welches Format Sie für die Eingabe verwenden.
- Sie können nicht mehrere Eingaben vornehmen (dh ein Array, das in die relevanten Byte-Größen unterteilt ist), es sei denn, dies ist die einzige Möglichkeit für Ihre Sprache, Eingaben vorzunehmen. Das Parsen der Eingabe ist Teil der Herausforderung.
- Dies kann eine Zeichenfolge von
- Sie können davon ausgehen, dass die Eingabe gültig ist (zum Beispiel müssen Sie keine Datumsprüfung durchführen, um zu überprüfen, ob das Datum gültig ist).
- Nicht verwendete Bytes können alle
0
, alle1
usw. sein, solange sie vorhanden sind. In den folgenden Beispielen habe ich all0
für die nicht verwendeten Bytes verwendet.
Ausgabe
Entweder gedruckt auf dem Bildschirm oder zurückgegeben:
- Der Dateiname als ASCII-Zeichenfolge
- Die Dateiattribute als ASCII-Zeichenfolge
- Die Erstellungszeit und das Erstellungsdatum, mit entsprechenden Trennzeichen (Doppelpunkte, Schrägstriche, etwas zur Unterscheidung der Komponenten)
- Die geänderte Uhrzeit und das geänderte Datum, ebenfalls mit entsprechenden Trennzeichen
- Die Dateigröße
Bei der Ausgabe kann es sich um eine durch Leerzeichen oder Zeilenumbrüche getrennte Einzelzeichenfolge, separate Elemente in einem Array usw. handeln. Bitte geben Sie in Ihrer Antwort an, wie Ihre Ausgabe formatiert ist.
Regeln
- Standard-E / A-Formate sind zulässig.
- Es ist entweder ein vollständiges Programm oder eine Funktion zulässig.
- Standardlücken sind verboten.
- Dies ist Code-Golf , daher gelten alle üblichen Golfregeln und der kürzeste Code gewinnt.
- Built-Ins, die genau diese Funktion ausführen, sind verboten.
Beispiele
0111000001110010011011110110011101110010011000010110110101101101011010010110111001100111000001100000000000000000101000100100010001001000110101000000000000000000000000000000000010100010010001000100100011010100000000000000000000000000000000001101000000000000
programm.ing HS 20:18:08 2016/06/20 20:18:08 2016/06/20 53248
0010000000100000001000000010000001110000011100000110001101100111001000000010000000100000000101000000000000000000010111010110110000111101100111110000000000000000000000000000000010100010010001000100100011010100000000000000000011110000000100111111001011100001
ppcg SDS 11:43:24 2010/12/31 20:18:08 2016/06/20 0
SD S
ein gültiges Flag gesetzt?