Sistem file Microsoft FAT memiliki tabel direktori untuk mewakili "file" mana di mana "folder" pada disk. Untuk saat ini, entri-entri ini menjejalkan banyak informasi menjadi sejumlah kecil bit. Ada banyak spesifikasi teknis di Wiki untuk yang penasaran, tetapi tantangan di sini adalah fokus pada decoding entri yang "sederhana".
Setiap entri terdiri dari kata biner 32 byte, dipecah menjadi beberapa bagian. Untuk konsistensi dalam tantangan ini, kita akan menggunakan versi MS-DOS 5.0, byte dipesan sebagai big endian , dan kami menyebut byte 0x00
sebagai yang paling kiri, dan byte 0x1F
sebagai yang paling kanan.
Di bawah ini adalah skema singkat dari bagian yang relevan, dan apa yang harus menjadi output untuk setiap bagian ( dicetak tebal ).
- 11 byte pertama adalah nama file dalam format ASCII (ini adalah asal nama file 8.3 yang terkenal - 8 byte untuk nama file, 3 byte untuk ekstensi). Ini adalah pengkodean ASCII lurus, dan harus menjadi keluaran ASCII dengan titik (.) Di antaranya .
- Catatan: bagian 8 dan 3 diisi dengan spasi untuk membuat entri panjang penuh. Outputnya harus mengabaikan spasi (yaitu, jangan outputnya).
- Ekstensi file mungkin kosong (yaitu, semua spasi), dalam hal ini output tidak boleh menampilkan titik .
- Karena ASCII hanya menggunakan 7 bit yang lebih rendah, byte akan memiliki yang terdepan
0
.
- Byte berikutnya (0x0b) adalah bitmask dari berikut ini:
- 0x01 Hanya Baca - RO output
- 0x02 Tersembunyi - keluaran H
- 0x04 Sistem - output S
- 0x08 Volume Label - output VL . Ukuran file (di bawah) harus berupa 0 , terlepas dari entri yang sebenarnya.
- Subdirektori 0x10 - output SD . Ukuran file (di bawah) harus berupa 0 , terlepas dari entri yang sebenarnya.
- 0x20 Archive - output A
- 0x40 Device - diabaikan untuk tantangan ini.
- 0x80 Dicadangkan - diabaikan untuk tantangan ini.
- Karena ini adalah bitmask, beberapa flag dimungkinkan - semua output yang berlaku harus disatukan bersama dalam urutan apa pun. Misalnya,
0xff
bisa jadiROHSVLSDA
(atau kombinasi lainnya).
- Dua byte berikutnya (0x0c dan 0x0d) tidak digunakan di bawah MS-DOS 5.0.
- Dua byte berikutnya (0x0e dan 0x0f) adalah waktu pembuatan sebagai berikut:
- Bit 15 hingga 11 adalah jam dalam format 24 jam - output 00 hingga 23
- Bit 10 hingga 5 adalah menit - output 00 hingga 59
- Bit 4 hingga 0 adalah detik / 2 - output 00 hingga 58 (perhatikan bahwa detik hanya dalam resolusi dua detik)
- Untuk klarifikasi:
hhhhhmmmmmmsssss
ketika ditulis big-endian.
- Dua byte berikutnya (0x10 dan 0x11) adalah tanggal pembuatan sebagai berikut:
- Bit 15-9 adalah tahun - output 1980 untuk
0
hingga 2107 untuk127
- Bit 8 hingga 5 adalah bulan - output 1 hingga 12 (dengan atau tanpa nol)
- Bit 4 hingga 0 adalah hari - output 0 hingga 31 (dengan atau tanpa nol di depan)
- Untuk klarifikasi:
yyyyyyymmmmddddd
ketika ditulis big-endian.
- Bit 15-9 adalah tahun - output 1980 untuk
- Dua byte berikutnya (0x12 dan 0x13) adalah tanggal akses terakhir. Saat digunakan dalam MS-DOS 5.0, kami mengabaikan bagian ini untuk tantangan ini.
- Dua byte berikutnya (0x14 dan 0x15) tidak digunakan oleh MS-DOS 5.0.
- Dua byte berikutnya (0x16 dan 0x17) adalah waktu yang dimodifikasi terakhir, mengikuti format yang sama dengan waktu pembuatan, di atas.
- Dua byte berikutnya (0x18 dan 0x19) adalah tanggal terakhir yang dimodifikasi, mengikuti format yang sama dengan tanggal pembuatan, di atas.
- Dua byte berikutnya (0x1a dan 0x1b) adalah lokasi cluster dari file pada disk. Kami mengabaikan bagian ini untuk tantangan ini.
- Empat byte terakhir (0x1c, 0x1d, 0x1e, dan 0x1f) adalah ukuran file - output sebagai integer yang tidak ditandai , kecuali jika flag VL atau SD diatur (di atas), dalam hal ini output
0
.
Representasi visual
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
\______________________________FILENAME________________________________________________/\_ATTR_/\___NOTUSED____/\_CREATIONTIME_/\_CREATIONDATE_/\__LASTACCESS__/\___NOTUSED____/\_MODIFIEDTIME_/\_MODIFIEDDATE_/\___NOTUSED____/\___________FILESIZE___________/
Memasukkan
- Satu kata 32-byte (yaitu, 256 bit), dalam format apa pun yang nyaman.
- Ini bisa berupa string
1
dan0
, seperti beberapa unsignedint
, array nilai Boolean, dll. - Silakan tentukan dalam jawaban Anda format apa yang Anda gunakan untuk input.
- Anda tidak dapat mengambil beberapa input (yaitu, array yang dipecah sebelumnya ke ukuran byte yang relevan) kecuali jika itu satu - satunya cara bahasa Anda untuk mengambil input. Mengurai input adalah bagian dari tantangan.
- Ini bisa berupa string
- Anda dapat menganggap input valid (misalnya, Anda tidak perlu melakukan pengecekan tanggal untuk memverifikasi bahwa tanggal tersebut valid).
- Bytes yang tidak digunakan bisa semuanya
0
, semua1
, dll., Asalkan ada. Dalam contoh di bawah ini, saya menggunakan semua0
byte yang tidak digunakan.
Keluaran
Baik dicetak ke layar atau dikembalikan, berikut ini:
- Nama file sebagai string ASCII
- Atribut file sebagai string ASCII
- Waktu pembuatan dan tanggal pembuatan, dengan pemisah yang sesuai (titik dua, garis miring, sesuatu untuk membedakan komponen)
- Waktu yang dimodifikasi dan tanggal yang dimodifikasi, sekali lagi dengan pemisah yang sesuai
- Ukuran file
Outputnya dapat berupa string tunggal yang dipisahkan oleh spasi atau dipisahkan oleh baris baru, elemen yang terpisah dalam array, dll. Silakan tentukan dalam jawaban Anda bagaimana output Anda diformat.
Aturan
- Format I / O standar dapat diterima.
- Program lengkap atau fungsi dapat diterima.
- Celah standar dilarang.
- Ini adalah kode-golf , jadi semua aturan golf biasa berlaku, dan kode terpendek menang.
- Built-in yang melakukan fungsi ini persis dilarang.
Contohnya
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
set bendera yang valid?