Il file system Microsoft FAT ha una tabella di directory per rappresentare quali "file" si trovano in quali "cartelle" sul disco. Per il momento, queste voci hanno riempito molte informazioni in una piccola quantità di bit. Ci sono un sacco di specifiche tecniche su Wiki per i curiosi, ma la sfida qui si concentrerà su una "semplice" decodifica di una voce.
Ogni voce è composta da una parola binaria a 32 byte, suddivisa in più sezioni. Per coerenza in questa sfida, utilizzeremo la versione 5.0 di MS-DOS, i byte sono ordinati come big endian e chiameremo byte 0x00
come l'estrema sinistra e byte0x1F
come il più a destra.
Di seguito è riportato un breve schema delle sezioni pertinenti e quale dovrebbe essere l'output per ciascuna sezione (in grassetto ).
- I primi 11 byte sono il nome del file in formato ASCII (da qui deriva il famoso nome di file 8.3 - 8 byte per il nome del file, 3 byte per l'estensione). Questi sono codifica ASCII diretta e devono essere emessi come ASCII con un punto (.) Tra .
- Nota: entrambe le parti 8 e 3 sono riempite con spazi per fare una voce a lunghezza intera. L'output dovrebbe ignorare gli spazi (ovvero non emetterli).
- L'estensione del file potrebbe essere vuota (ovvero tutti gli spazi), nel qual caso l'output non dovrebbe generare il punto .
- Poiché ASCII utilizza solo i 7 bit inferiori, i byte avranno tutti un vantaggio
0
.
- Il byte successivo (0x0b) è una maschera di bit di quanto segue:
- 0x01 Sola lettura - uscita RO
- 0x02 Nascosto - uscita H
- Sistema 0x04 - uscita S
- Etichetta volume 0x08 - uscita VL . Le dimensioni del file (in basso) devono essere visualizzate come 0 , indipendentemente dalla voce effettiva.
- Sottodirectory 0x10 - output SD . Le dimensioni del file (in basso) devono essere visualizzate come 0 , indipendentemente dalla voce effettiva.
- 0x20 Archive - output A
- Dispositivo 0x40: ignorato per questa sfida.
- 0x80 riservato - ignorato per questa sfida.
- Poiché si tratta di una maschera di bit, sono possibili più flag: tutti gli output applicabili devono essere concatenati insieme in qualsiasi ordine. Ad esempio,
0xff
potrebbe essereROHSVLSDA
(o qualsiasi altra combinazione).
- I successivi due byte (0x0c e 0x0d) non vengono utilizzati in MS-DOS 5.0.
- I successivi due byte (0x0e e 0x0f) sono i tempi di creazione come segue:
- I bit da 15 a 11 sono le ore nel formato 24 ore - output da 00 a 23
- I bit da 10 a 5 sono i minuti - uscita da 00 a 59
- I bit da 4 a 0 sono i secondi / 2 - uscita da 00 a 58 (notare che i secondi sono solo con una risoluzione di due secondi)
- Per chiarimenti:
hhhhhmmmmmmsssss
quando scritto big-endian.
- I successivi due byte (0x10 e 0x11) sono la data di creazione come segue:
- I bit da 15 a 9 sono l'anno - uscita 1980 per
0
un massimo di 2107 per127
- I bit da 8 a 5 sono i mesi - output da 1 a 12 (con o senza zero iniziale)
- I bit da 4 a 0 sono il giorno - output da 0 a 31 (con o senza zero iniziale)
- Per chiarimenti:
yyyyyyymmmmddddd
quando scritto big-endian.
- I bit da 15 a 9 sono l'anno - uscita 1980 per
- I successivi due byte (0x12 e 0x13) sono la data dell'ultimo accesso. Mentre utilizzato in MS-DOS 5.0, ignoriamo questa parte per questa sfida.
- I successivi due byte (0x14 e 0x15) non vengono utilizzati da MS-DOS 5.0.
- I successivi due byte (0x16 e 0x17) sono l'ora dell'ultima modifica, seguendo lo stesso formato dell'ora di creazione, sopra.
- I successivi due byte (0x18 e 0x19) sono l'ultima data modificata, seguendo lo stesso formato della data di creazione sopra.
- I successivi due byte (0x1a e 0x1b) sono la posizione del cluster del file sul disco. Stiamo ignorando questa parte per questa sfida.
- Gli ultimi quattro byte (0x1c, 0x1d, 0x1e e 0x1f) sono le dimensioni del file - output come numero intero senza segno , a meno che non siano impostati (sopra) i flag VL o SD , nel qual caso output
0
.
Rappresentazione visiva
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
\______________________________FILENAME________________________________________________/\_ATTR_/\___NOTUSED____/\_CREATIONTIME_/\_CREATIONDATE_/\__LASTACCESS__/\___NOTUSED____/\_MODIFIEDTIME_/\_MODIFIEDDATE_/\___NOTUSED____/\___________FILESIZE___________/
Ingresso
- Una sola parola da 32 byte (ovvero 256 bit), in qualsiasi formato sia conveniente.
- Questo potrebbe essere una stringa di
1
e0
, come moltiint
s non firmati , una matrice di valori booleani, ecc. - Si prega di specificare nella risposta quale formato si sta utilizzando per l'input.
- Non è possibile accettare input multipli (ad es. Un array pre-suddiviso nelle relative dimensioni di byte) a meno che non sia l' unico modo per la propria lingua di ricevere input. L'analisi dell'input fa parte della sfida.
- Questo potrebbe essere una stringa di
- Puoi presumere che l'input sia valido (ad esempio, non è necessario eseguire il controllo della data per verificare che la data sia valida).
- I byte non utilizzati possono essere tutti
0
, tutti1
, ecc., Purché siano presenti. Negli esempi seguenti, ho usato tutto0
per i byte non utilizzati.
Produzione
O stampato sullo schermo o restituito, il seguente:
- Il nome file come stringa ASCII
- Il file viene attribuito come stringa ASCII
- L'ora di creazione e la data di creazione, con i separatori appropriati (due punti, barre, qualcosa per distinguere i componenti)
- L'ora e la data modificate, sempre con i separatori appropriati
- La dimensione del file
L'output può essere una stringa singola separata da spazio o newline, elementi separati in un array, ecc. Specificare nella risposta come viene formattato l'output.
Regole
- I formati I / O standard sono accettabili.
- È accettabile un programma completo o una funzione.
- Sono vietate le scappatoie standard .
- Questo è code-golf , quindi si applicano tutte le normali regole del golf e vince il codice più corto.
- Gli built-in che svolgono esattamente questa funzione sono vietati.
Esempi
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
un set di flag valido?