36 lines
1.4 KiB
Python
36 lines
1.4 KiB
Python
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 |