El sistema de archivos FAT de Microsoft tiene una tabla de directorio para representar qué "archivos" están en qué "carpetas" en el disco. Por el momento, estas entradas concentraron mucha información en una pequeña cantidad de bits. Hay un montón de especificaciones técnicas en Wiki para los curiosos, pero el desafío aquí se centrará en una decodificación "simple" de una entrada.
Cada entrada consta de una palabra binaria de 32 bytes, dividida en varias secciones. Para mantener la coherencia en este desafío, utilizaremos la versión 5.0 de MS-DOS, los bytes se ordenan como big endian y llamamos byte 0x00
como el más a la izquierda y byte 0x1F
como el más a la derecha.
A continuación se muestra un breve esquema de las secciones relevantes y cuál debería ser el resultado de cada sección (en negrita ).
- Los primeros 11 bytes son el nombre del archivo en formato ASCII (de aquí proviene el famoso nombre de archivo 8.3: 8 bytes para el nombre del archivo, 3 bytes para la extensión). Estas son codificaciones ASCII directas y deben enviarse como ASCII con un punto (.) Entre ellas .
- Nota: tanto las partes 8 como las 3 están acolchadas con espacios para hacer una entrada de longitud completa. El resultado debe ignorar los espacios (es decir, no generarlos).
- La extensión del archivo puede estar vacía (es decir, todos los espacios), en cuyo caso la salida no debería mostrar el punto .
- Dado que ASCII solo usa los 7 bits inferiores, todos los bytes tendrán un inicio
0
.
- El siguiente byte (0x0b) es una máscara de bits de lo siguiente:
- 0x01 Solo lectura - salida RO
- 0x02 Oculto - salida H
- Sistema 0x04 - salida S
- 0x08 Etiqueta de volumen - salida VL . El tamaño del archivo (a continuación) debe aparecer como 0 , independientemente de su entrada real.
- Subdirectorio 0x10 - salida SD . El tamaño del archivo (a continuación) debe aparecer como 0 , independientemente de su entrada real.
- Archivo 0x20 - salida A
- Dispositivo 0x40: ignorado para este desafío.
- 0x80 reservado: ignorado para este desafío.
- Como se trata de una máscara de bits, son posibles varios indicadores: todas las salidas aplicables se deben concatenar juntas en cualquier orden. Por ejemplo,
0xff
podría serROHSVLSDA
(o cualquier otra combinación).
- Los siguientes dos bytes (0x0c y 0x0d) no se utilizan en MS-DOS 5.0.
- Los siguientes dos bytes (0x0e y 0x0f) son el tiempo de creación de la siguiente manera:
- Los bits 15 a 11 son las horas en formato de 24 horas - salida 00 a 23
- Los bits 10 a 5 son los minutos: salida 00 a 59
- Los bits 4 a 0 son los segundos / 2 - salida 00 a 58 (tenga en cuenta que los segundos son solo en resolución de dos segundos)
- Para aclarar:
hhhhhmmmmmmsssss
cuando se escribe big-endian.
- Los siguientes dos bytes (0x10 y 0x11) son la fecha de creación de la siguiente manera:
- Los bits 15 a 9 son el año: salida 1980 para
0
hasta 2107 para127
- Los bits 8 a 5 son los meses: salida 1 a 12 (con o sin cero a la izquierda)
- Los bits 4 a 0 son el día - salida 0 a 31 (con o sin cero a la izquierda)
- Para aclarar:
yyyyyyymmmmddddd
cuando se escribe big-endian.
- Los bits 15 a 9 son el año: salida 1980 para
- Los siguientes dos bytes (0x12 y 0x13) son la última fecha de acceso. Si bien se usa en MS-DOS 5.0, ignoramos esta parte para este desafío.
- MS-DOS 5.0 no utiliza los siguientes dos bytes (0x14 y 0x15).
- Los siguientes dos bytes (0x16 y 0x17) son la última hora modificada, siguiendo el mismo formato que la hora de creación, arriba.
- Los siguientes dos bytes (0x18 y 0x19) son la última fecha de modificación, siguiendo el mismo formato que la fecha de creación, arriba.
- Los siguientes dos bytes (0x1a y 0x1b) son la ubicación del clúster del archivo en el disco. Estamos ignorando esta porción para este desafío.
- Los cuatro bytes finales (0x1c, 0x1d, 0x1e y 0x1f) son el tamaño del archivo, que se genera como un entero sin signo , a menos que se establezcan los indicadores VL o SD (arriba), en cuyo caso se generará
0
.
Representación visual
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
\______________________________FILENAME________________________________________________/\_ATTR_/\___NOTUSED____/\_CREATIONTIME_/\_CREATIONDATE_/\__LASTACCESS__/\___NOTUSED____/\_MODIFIEDTIME_/\_MODIFIEDDATE_/\___NOTUSED____/\___________FILESIZE___________/
Entrada
- Una sola palabra de 32 bytes (es decir, 256 bits), en cualquier formato que sea conveniente.
- Esto podría ser como una cadena de
1
y0
, como variosint
s sin signo , una matriz de valores booleanos, etc. - Especifique en su respuesta qué formato está utilizando para la entrada.
- No puede tomar entradas múltiples (es decir, una matriz previamente dividida en los tamaños de bytes relevantes) a menos que esa sea la única forma en que su idioma pueda ingresar. Analizar la entrada es parte del desafío.
- Esto podría ser como una cadena de
- Puede suponer que la entrada es válida (por ejemplo, no necesita realizar una verificación de fecha para verificar que la fecha sea válida).
- Los bytes que no se usan pueden ser todos
0
, todos1
, etc., siempre que estén presentes. En los ejemplos a continuación, utilicé todo0
para los bytes no utilizados.
Salida
Ya sea impreso en pantalla o devuelto, lo siguiente:
- El nombre del archivo como una cadena ASCII
- El archivo se atribuye como una cadena ASCII
- El tiempo de creación y la fecha de creación, con separadores apropiados (dos puntos, barras, algo para distinguir los componentes)
- La hora modificada y la fecha modificada, nuevamente con los separadores apropiados
- El tamaño del archivo
La salida puede ser una cadena individual separada por espacios o por líneas nuevas, elementos separados en una matriz, etc. Especifique en su respuesta cómo se formatea su salida.
Reglas
- Los formatos estándar de E / S son aceptables.
- Un programa completo o una función son aceptables.
- Las lagunas estándar están prohibidas.
- Este es el código de golf , por lo que se aplican todas las reglas habituales de golf y gana el código más corto.
- Las incorporaciones que realizan exactamente esta función están prohibidas.
Ejemplos
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
sería un conjunto de banderas válido?