Файлова система Microsoft FAT має таблицю каталогів, яка відображає, які "файли" є, в яких "папках" на диску. За цей час ці записи набивали багато інформації невеликою кількістю біт. У Вікі є купа технічних специфікацій для допитливих, але тут завдання полягає в тому, щоб зосередитись на "простому" розшифровці запису.
Кожен запис складається з 32-байтового бінарного слова, розбитого на кілька розділів. Для узгодженості цього виклику ми будемо використовувати версію MS-DOS 5.0, байти впорядковані як великий ендіан , і ми називаємо байт 0x00
як лівий, а байт - 0x1F
як правий самий.
Нижче наводиться коротка схема відповідних розділів, а також який повинен бути вихід для кожного розділу ( жирним шрифтом ).
- Перші 11 байт - це ім'я файлу у форматі ASCII (звідси походить відоме ім'я файлу 8.3 - 8 байт для імені файлу, 3 байти для розширення). Це пряме кодування ASCII, і їх слід виводити як ASCII з періодом (.) Між .
- Примітка: і 8, і 3 частини прокладені пробілами, щоб зробити повний запис. Вихід повинен ігнорувати пробіли (тобто не виводити їх).
- Розширення файлу може бути порожнім (тобто всі пробіли), і в цьому випадку вихід не повинен виводити крапку .
- Оскільки ASCII використовує лише нижні 7 біт, всі байти матимуть провідне місце
0
.
- Наступний байт (0x0b) - це бітова маска наступного:
- 0x01 Тільки для читання - вихід RO
- 0x02 Прихований - вихід H
- 0x04 Система - вихід S
- 0x08 Мітка гучності - вихід VL . Розмір файлу (нижче) повинен виводитися як 0 , незалежно від його фактичного введення.
- Підкаталог 0x10 - вихід SD . Розмір файлу (нижче) повинен виводитися як 0 , незалежно від його фактичного введення.
- Архів 0x20 - вихід A
- Пристрій 0x40 - ігнорується для цього виклику.
- 0x80 Зарезервовано - ігнорується для цього виклику.
- Оскільки це бітова маска, можливі кілька прапорів - всі застосовні виходи повинні бути об'єднані разом у будь-якому порядку. Наприклад,
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
коли пишеться біг-ендіан.
- Наступні два байти (0x10 та 0x11) - це дата створення наступним чином:
- Біти від 15 до 9 - це рік - вихід 1980 для
0
до 2107 для127
- Біти 8 - 5 - це місяці - вихід 1 - 12 (з нульовим нулем або без нього)
- Біти 4 до 0 - це день - вихід 0 до 31 (з нульовим нулем або без нього)
- Для уточнення:
yyyyyyymmmmddddd
коли пишеться біг-ендіан.
- Біти від 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
s, масив булевих значень тощо. - Будь ласка, вкажіть у своїй відповіді, який формат ви використовуєте для введення.
- Ви не можете приймати кілька входів (тобто масив, попередньо розбитий на відповідні розміри байтів), якщо це не єдиний спосіб для вашої мови приймати дані. Розбір вводу є частиною завдання.
- Це може бути рядок
- Ви можете вважати, що дані є дійсними (наприклад, вам не потрібно проводити перевірку дати, щоб перевірити, чи дата є дійсною).
- Невикористаними байтами можуть бути всі
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
буде встановлений дійсний прапор?