| t | import sys | t | import sys |
| | | |
| def main(): | | def main(): |
| data = sys.stdin.buffer.read() | | data = sys.stdin.buffer.read() |
| reserved_sectors = 1 | | reserved_sectors = 1 |
| num_fat = 2 | | num_fat = 2 |
| sectors_per_fat = 9 | | sectors_per_fat = 9 |
| root_entries = 224 | | root_entries = 224 |
| sector_size = 512 | | sector_size = 512 |
| fat_start = reserved_sectors * sector_size | | fat_start = reserved_sectors * sector_size |
| root_start = fat_start + num_fat * sectors_per_fat * sector_size | | root_start = fat_start + num_fat * sectors_per_fat * sector_size |
| entry_size = 32 | | entry_size = 32 |
| entries = [] | | entries = [] |
| for i in range(root_entries): | | for i in range(root_entries): |
| start = root_start + i * entry_size | | start = root_start + i * entry_size |
| if start + entry_size > len(data): | | if start + entry_size > len(data): |
| break | | break |
| entry = data[start:start + entry_size] | | entry = data[start:start + entry_size] |
| first_byte = entry[0] | | first_byte = entry[0] |
| if first_byte in (0, 229): | | if first_byte in (0, 229): |
| continue | | continue |
| attr = entry[11] | | attr = entry[11] |
| if attr & 8: | | if attr & 8: |
| continue | | continue |
| name_bytes = entry[0:8].rstrip(b' ') | | name_bytes = entry[0:8].rstrip(b' ') |
| ext_bytes = entry[8:11].rstrip(b' ') | | ext_bytes = entry[8:11].rstrip(b' ') |
| name = name_bytes.decode('cp866') | | name = name_bytes.decode('cp866') |
| ext = ext_bytes.decode('cp866') | | ext = ext_bytes.decode('cp866') |
| if ext: | | if ext: |
| full_name = f'{name}.{ext}' | | full_name = f'{name}.{ext}' |
| else: | | else: |
| full_name = name | | full_name = name |
| if attr & 16: | | if attr & 16: |
| size_str = 'dir' | | size_str = 'dir' |
| else: | | else: |
| size_bytes = entry[28:32] | | size_bytes = entry[28:32] |
| size = int.from_bytes(size_bytes, 'little') | | size = int.from_bytes(size_bytes, 'little') |
| size_str = str(size) | | size_str = str(size) |
| entries.append((full_name, size_str)) | | entries.append((full_name, size_str)) |
| entries.sort(key=lambda x: x[0]) | | entries.sort(key=lambda x: x[0]) |
| for name, size in entries: | | for name, size in entries: |
| print(f'{name:12} {size}') | | print(f'{name:12} {size}') |
| if __name__ == '__main__': | | if __name__ == '__main__': |
| main() | | main() |