Nikita_luk Fat12 9216
Aleksey Fat12 9105
f1import sysf1import sys
2import struct2import struct
33
n4def parse_fat12_disk(img):n4def read_fat12_disk_image(image_data):
5    SECTOR = 5125    sector_size = 512
6    ROOT_OFFSET = 19 * SECTOR6    root_dir_start = 19 * sector_size
7    entries_list = []7    root_dir_entries = []
8    for idx in range(224):8    for i in range(224):
9        start_pos = ROOT_OFFSET + idx * 329        entry_start = root_dir_start + i * 32
10        entry_bytes = img[start_pos:start_pos + 32]10        entry_data = image_data[entry_start:entry_start + 32]
11        if len(entry_bytes) < 32:11        if len(entry_data) < 32:
12            break12            break
n13        first_char = entry_bytes[0]n13        first_byte = entry_data[0]
14        if first_char == 0:14        if first_byte == 0:
15            break15            break
n16        if first_char == 229:n16        if first_byte == 229:
17            continue17            continue
n18        name_part = entry_bytes[0:8]n18        name_bytes = entry_data[0:8]
19        ext_part = entry_bytes[8:11]19        ext_bytes = entry_data[8:11]
20        attributes = entry_bytes[11]20        attr = entry_data[11]
21        if attributes & 8:21        if attr & 8:
22            continue22            continue
n23        file_size_val = struct.unpack('<I', entry_bytes[28:32])[0]n23        size = struct.unpack('<I', entry_data[28:32])[0]
24        name_str = name_part.decode('cp866', errors='ignore').rstrip()24        name = name_bytes.decode('cp866', errors='replace').rstrip()
25        ext_str = ext_part.decode('cp866', errors='ignore').rstrip()25        ext = ext_bytes.decode('cp866', errors='replace').rstrip()
26        if ext_str:26        if ext:
27            full_name = f'{name_str}.{ext_str}'27            filename = f'{name}.{ext}'
28        else:28        else:
n29            full_name = name_strn29            filename = name
30        is_dir_flag = attributes & 16 != 030        is_directory = attr & 16 != 0
31        entries_list.append((full_name, file_size_val, is_dir_flag))31        root_dir_entries.append((filename, size, is_directory))
32    return entries_list32    return root_dir_entries
3333
n34def execute_main():n34def main():
35    input_data = sys.stdin.buffer.read()35    image_data = sys.stdin.buffer.read()
36    if len(input_data) != 1474560:36    if len(image_data) != 1474560:
37        return37        return
n38    disk_entries = parse_fat12_disk(input_data)n38    entries = read_fat12_disk_image(image_data)
39    if not disk_entries:39    if not entries:
40        return40        return
n41    disk_entries.sort(key=lambda itemitem[0].upper())n41    entries.sort(key=lambda xx[0].upper())
42    for entry_name, entry_size, is_dir in disk_entries:42    for filename, size, is_directory in entries:
43        if is_dir:43        if is_directory:
44            print(f'{entry_name:12} dir')44            print(f'{filename:12} dir')
45        else:45        else:
n46            print(f'{entry_name:12} {entry_size}')n46            print(f'{filename:12} {size}')
47if __name__ == '__main__':47if __name__ == '__main__':
t48    execute_main()t48    main()
Legends
Colors
 Added 
Changed
Deleted
Links
(f)irst change
(n)ext change
(t)op