class BitReader: """ Класс для чтение битов из байтовой строки (bytes). """ def __init__(self, data): self.data = data self.bit_pos = 0 self.total_bits = len(data) * 8 def read_bits(self, length): """ Считывает length бит и возвращает их как целое число. """ if self.bit_pos + length > self.total_bits: raise ValueError(f"Недостаточно данных: запрошено {length}, осталось {self.remaining()}") value = 0 # Читаем побитово (можно оптимизировать, но так надежнее для понимания) for _ in range(length): byte_index = self.bit_pos // 8 # В байте биты идут слева направо (7..0), где 7 - старший bit_offset = 7 - (self.bit_pos % 8) bit = (self.data[byte_index] >> bit_offset) & 1 value = (value << 1) | bit self.bit_pos += 1 return value def has_bits(self, length): """Проверяет, осталось ли достаточно бит для чтения.""" return self.bit_pos + length <= self.total_bits def remaining(self): return self.total_bits - self.bit_pos