31 lines
856 B
Python
31 lines
856 B
Python
|
|
"""
|
|||
|
|
2026/4/5
|
|||
|
|
TMY
|
|||
|
|
比特位打包器
|
|||
|
|
"""
|
|||
|
|
class BitPacker:
|
|||
|
|
def __init__(self, total_bytes):
|
|||
|
|
self.buf = bytearray(total_bytes)
|
|||
|
|
|
|||
|
|
def set_bits(self, start_byte, start_bit, bit_len, value):
|
|||
|
|
"""
|
|||
|
|
start_byte: 起始字节
|
|||
|
|
start_bit: 起始比特位(0~7)
|
|||
|
|
bit_len: 比特长度
|
|||
|
|
value: 无符号整数值
|
|||
|
|
"""
|
|||
|
|
value = int(value) & ((1 << bit_len) - 1)
|
|||
|
|
bit_pos = start_byte * 8 + start_bit
|
|||
|
|
|
|||
|
|
for i in range(bit_len):
|
|||
|
|
bit = (value >> (bit_len - 1 - i)) & 1
|
|||
|
|
byte_idx = bit_pos // 8
|
|||
|
|
bit_idx = 7 - (bit_pos % 8)
|
|||
|
|
if bit:
|
|||
|
|
self.buf[byte_idx] |= (1 << bit_idx)
|
|||
|
|
else:
|
|||
|
|
self.buf[byte_idx] &= ~(1 << bit_idx)
|
|||
|
|
bit_pos += 1
|
|||
|
|
|
|||
|
|
def get_bytes(self):
|
|||
|
|
return bytes(self.buf)
|