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