Exemple #1
0
    def __init__(self, io_manager: IOManager):
        io_manager.seek(0)

        self.BS_jmpBoot = io_manager.read_bytes_and_convert_to_int(3)
        self.BS_OEMName = io_manager.read_bytes_and_convert_to_int(8)
        self.BPB_BytsPerSec = io_manager.read_bytes_and_convert_to_int(
            2)  # Количество байт в одном секторе
        #                                                               (512, 1024, 2048 or 4096)
        self.BPB_SecPerClus = io_manager.read_bytes_and_convert_to_int(
            1)  # Количество секторов в кластере
        self.BPB_ResvdSecCnt = io_manager.read_bytes_and_convert_to_int(2)
        self.BPB_NumFATs = io_manager.read_bytes_and_convert_to_int(
            1)  # Количество таблиц FAT на диске
        self.BPB_RootEntCnt = io_manager.read_bytes_and_convert_to_int(
            2)  # Для FAT16 поле содержит число 32-байтных
        #                                                               элементов корневой директории. Для FAT32 дисков,
        #                                                               это поле должно быть 0
        self.BPB_TotSec16 = io_manager.read_bytes_and_convert_to_int(
            2)  # Старое 16-битное поле: общее количество
        #                                                              секторов на диске
        self.BPB_Media = io_manager.read_bytes_and_convert_to_int(1)
        self.BPB_FATSz16 = io_manager.read_bytes_and_convert_to_int(
            2)  # FAT16 это количество секторов одной FAT. Для
        #                                                            FAT32 это значение 0
        self.BPB_SecPerTrk = io_manager.read_bytes_and_convert_to_int(2)
        self.BPB_NumHeads = io_manager.read_bytes_and_convert_to_int(2)
        self.BPB_HiddSec = io_manager.read_bytes_and_convert_to_int(4)
        self.BPB_TotSec32 = io_manager.read_bytes_and_convert_to_int(
            4)  # Новое 32-битное поле: общее количество
        #                                                             секторов на диске

        self.BPB_FATSz32 = io_manager.read_bytes_and_convert_to_int(
            4)  # Поле, необходимое для некоторых вычислений,
        #                                                            может быть некорректным в некоторых ситуациях
        io_manager.jump_back(4)  # сохранение целостности данных

        if self.BPB_FATSz16 != 0:
            fat_sz = self.BPB_FATSz16
        else:
            fat_sz = self.BPB_FATSz32

        self._root_dir_sectors = (
            (self.BPB_RootEntCnt * 32) +
            (self.BPB_BytsPerSec - 1)) // self.BPB_BytsPerSec
        self.first_data_sector = self.BPB_ResvdSecCnt + self._root_dir_sectors + self.BPB_NumFATs * fat_sz

        self.count_of_clusters = self._get_count_of_clusters()
        self.fat_type = self._get_fat_type()

        if self.fat_type == TypeOfFAT.fat16:
            self._parse_fat16_structure(io_manager)
        else:
            self._parse_fat32_structure(io_manager)

        self.first_root_dir_sec = self._get_first_root_dir_sec()
 def test_jump_back_with_correct_value(self):
     io_manager = IOManager('test_io_manager')
     io_manager.read_some_bytes(1)
     io_manager.jump_back(1)
     self.assertEqual(io_manager._current_position, 0)