34 lines
1.5 KiB
Python
34 lines
1.5 KiB
Python
class BitWriter:
|
|
"""
|
|
Класс для накопления бит и их конвертации в байтовую строку.
|
|
"""
|
|
|
|
def __init__(self):
|
|
self.value = 0
|
|
self.bit_count = 0
|
|
|
|
def add_bits(self, val, length):
|
|
"""
|
|
Добавляет length бит из числа val в поток.
|
|
"""
|
|
# Сдвигаем текущее накопленное значение влево на length
|
|
self.value = (self.value << length) | (val & ((1 << length) - 1))
|
|
self.bit_count += length
|
|
|
|
def get_bytes(self):
|
|
"""
|
|
Возвращает накопленные биты в виде объекта bytes.
|
|
Если количество бит не кратно 8, дополняет нулями справа (до полного байта).
|
|
"""
|
|
if self.bit_count == 0:
|
|
return b''
|
|
|
|
# Вычисляем количество необходимых байт
|
|
num_bytes = (self.bit_count + 7) // 8
|
|
|
|
# Сдвигаем значение влево, чтобы заполнить последний байт, если он не полон
|
|
# Например, если есть 4 бита 1010, нам нужно получить байт 10100000 (0xA0)
|
|
shift_remainder = (num_bytes * 8) - self.bit_count
|
|
final_value = self.value << shift_remainder
|
|
|
|
return final_value.to_bytes(num_bytes, byteorder='big') |