Первый запуск
This commit is contained in:
36
Infrostructure/ProtocolCoder/BitReader.py
Normal file
36
Infrostructure/ProtocolCoder/BitReader.py
Normal file
@@ -0,0 +1,36 @@
|
||||
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
|
||||
Reference in New Issue
Block a user