Файловая система Microsoft FAT имеет таблицу каталогов для представления, какие «файлы» находятся в каких «папках» на диске. Пока что эти записи втиснули много информации в небольшое количество битов. На Wiki есть куча технических спецификаций для любопытных, но задача здесь будет сосредоточена на «простом» декодировании записи.
Каждая запись состоит из 32-байтового двоичного слова, разбитого на несколько разделов. Для обеспечения согласованности в этом вызове мы будем использовать версию MS-DOS 5.0, байты упорядочены с прямым порядком байтов , и мы называем байт 0x00
самым левым, а байт 0x1F
- самым правым.
Ниже приведена краткая схема соответствующих разделов, и что должно быть на выходе для каждого раздела ( выделено жирным шрифтом ).
- Первые 11 байтов - это имя файла в формате ASCII (отсюда и происходит известное имя файла 8.3 - 8 байтов для имени файла, 3 байта для расширения). Это прямое кодирование ASCII и должно быть выведено как ASCII с точкой (.) Между .
- Примечание: как 8, так и 3 части заполнены пробелами для полной записи. Вывод должен игнорировать пробелы (т.е. не выводить их).
- Расширение файла может быть пустым (т. Е. Все пробелы), и в этом случае выходные данные не должны выводить точку .
- Поскольку в ASCII используются только младшие 7 битов, все байты будут иметь начальные символы
0
.
- Следующий байт (0x0b) является битовой маской следующего:
- 0x01 Только чтение - вывод RO
- 0x02 Hidden - выход H
- 0x04 Система - выход S
- 0x08 Volume Label - выходной ВЛ . Размер файла (ниже) должен быть выведен как 0 , независимо от его фактической записи.
- Подкаталог 0x10 - вывод SD . Размер файла (ниже) должен быть выведен как 0 , независимо от его фактической записи.
- 0x20 Архив - выход А
- Устройство 0x40 - игнорируется для этой задачи.
- 0x80 Reserved - игнорируется для этой задачи.
- Поскольку это битовая маска, возможны несколько флагов - все применимые выходные данные должны объединяться вместе в любом порядке. Например,
0xff
может бытьROHSVLSDA
(или любая другая комбинация).
- Следующие два байта (0x0c и 0x0d) не используются в MS-DOS 5.0.
- Следующие два байта (0x0e и 0x0f) представляют собой время создания следующим образом:
- Биты с 15 по 11 - это часы в 24-часовом формате - выходные данные с 00 по 23
- Биты с 10 по 5 - минуты - вывод с 00 до 59
- Биты с 4 по 0 являются секундами / 2 - выводят от 00 до 58 (обратите внимание, что секунды имеют разрешение только в две секунды)
- Для пояснения:
hhhhhmmmmmmsssss
когда написано big-endian.
- Следующие два байта (0x10 и 0x11) представляют собой дату создания следующим образом:
- Биты 15 до 9 в год - выпуск 1980 для
0
до 2107 для127
- Биты с 8 по 5 - месяцы - выходные данные с 1 по 12 (с начальным нулем или без него)
- Биты с 4 по 0 - это день - вывод от 0 до 31 (с или без нуля в начале)
- Для пояснения:
yyyyyyymmmmddddd
когда написано big-endian.
- Биты 15 до 9 в год - выпуск 1980 для
- Следующие два байта (0x12 и 0x13) являются последней датой доступа. При использовании в MS-DOS 5.0 мы игнорируем эту часть для этой задачи.
- Следующие два байта (0x14 и 0x15) не используются MS-DOS 5.0.
- Следующие два байта (0x16 и 0x17) являются последним измененным временем, следуя тому же формату, что и время создания, описанному выше.
- Следующие два байта (0x18 и 0x19) - это дата последнего изменения, которая соответствует формату, указанному выше.
- Следующие два байта (0x1a и 0x1b) являются расположением кластера файла на диске. Мы игнорируем эту часть для этого вызова.
- Последние четыре байта (0x1c, 0x1d, 0x1e и 0x1f) - это размер файла - выводится как целое число без знака , если только не установлены флаги VL или SD (см. Выше), в этом случае выводится
0
.
Визуальное представление
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
\______________________________FILENAME________________________________________________/\_ATTR_/\___NOTUSED____/\_CREATIONTIME_/\_CREATIONDATE_/\__LASTACCESS__/\___NOTUSED____/\_MODIFIEDTIME_/\_MODIFIEDDATE_/\___NOTUSED____/\___________FILESIZE___________/
вход
- Одно 32-байтовое слово (то есть 256 бит) в любом удобном формате.
- Это может быть как строка
1
и0
, как несколько беззнаковыхint
с, массив значений булевых и т.д. - Пожалуйста, укажите в своем ответе, какой формат вы используете для ввода.
- Вы не можете получить множественный ввод (т. Е. Массив, предварительно разбитый на соответствующие размеры в байтах), если только это не единственный способ для вашего языка принять ввод. Разбор входных данных является частью проблемы.
- Это может быть как строка
- Вы можете предположить, что ввод действителен (например, вам не нужно выполнять проверку даты, чтобы убедиться, что дата действительна).
- Неиспользуемые байты могут быть всеми
0
, всеми1
и т. Д., Только если они присутствуют. В приведенных ниже примерах я использовал все0
для неиспользуемых байтов.
Выход
Либо распечатывается на экране, либо возвращается следующее:
- Имя файла в виде строки ASCII
- Атрибуты файла в виде строки ASCII
- Время создания и дата создания, с соответствующими разделителями (двоеточия, косые черты, что-то, чтобы различать компоненты)
- Измененное время и измененная дата, опять же с соответствующими разделителями
- Размер файла
Выводом может быть одна строка, разделенная пробелами или новая строка, отдельные элементы в массиве и т. Д. Пожалуйста, укажите в своем ответе, как форматируется ваш вывод.
правила
- Стандартные форматы ввода / вывода являются приемлемыми.
- Допустимы либо полная программа, либо функция.
- Стандартные лазейки запрещены.
- Это код-гольф , поэтому применяются все обычные правила игры в гольф, и выигрывает самый короткий код.
- Встроенные модули, выполняющие именно эту функцию, запрещены.
Примеры
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
ли установлен правильный флаг?