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)