87 uint32_t bit_val = ((uint32_t)bit) & 1U;
88 bb->
acc = (bb->
acc << 1U) | bit_val;
108 if ((bb != NULL) && (data != NULL)) {
111 if ((bb->
num_bits + num_bits) > max_bits) {
117 for (
size_t i = 0U; (i < num_bits) && (result ==
CCSDS124_OK); i++) {
118 size_t byte_index = i / 8U;
119 size_t bit_index = i % 8U;
122 uint32_t shift_amount = 7U - (uint32_t)bit_index;
123 uint32_t shifted = (uint32_t)data[byte_index] >> shift_amount;
124 uint32_t masked = shifted & 1U;
125 int bit = (int)masked;
154 if ((bb != NULL) && (num_bits > 0U) && (num_bits <= 24U)) {
157 if ((bb->
num_bits + num_bits) > max_bits) {
163 uint32_t mask = (1U << (uint32_t)num_bits) - 1U;
164 uint32_t masked_value = value & mask;
166 bb->
acc = (bb->
acc << (uint32_t)num_bits) | masked_value;
184 if ((bb != NULL) && (bv != NULL)) {
188 size_t num_bytes = (bv->
length + 7U) / 8U;
191 for (
size_t byte_idx = 0U; (byte_idx < num_bytes) && (result ==
CCSDS124_OK); byte_idx++) {
192 size_t bits_in_this_byte = 8U;
195 if (byte_idx == (num_bytes - 1U)) {
196 size_t remainder = bv->
length % 8U;
197 if (remainder != 0U) {
198 bits_in_this_byte = remainder;
205 size_t start_bit = byte_idx * 8U;
206 for (
size_t bit_offset = 0U; (bit_offset < bits_in_this_byte) && (result ==
CCSDS124_OK); bit_offset++) {
207 size_t pos = start_bit + bit_offset;
245 size_t num_bytes = 0U;
247 if ((bb != NULL) && (data != NULL)) {
249 num_bytes = (bb->
num_bits + 7U) / 8U;
251 if (num_bytes > max_bytes) {
252 num_bytes = max_bytes;
257 if (flushed_bytes > num_bytes) {
258 flushed_bytes = num_bytes;
260 if (flushed_bytes > 0U) {
261 (void)memcpy(data, bb->
data, flushed_bytes);
265 if ((bb->
acc_len > 0U) && (flushed_bytes < num_bytes)) {
267 uint8_t last_byte = (uint8_t)(bb->
acc << (8U - bb->
acc_len));
268 data[flushed_bytes] = last_byte;
static void bitbuffer_flush_acc(bitbuffer_t *bb)
Flush accumulator to data buffer when it has 8+ bits.
CCSDS 124.0-B-1 Compression Library - Public API.
int bitbuffer_append_bitvector(bitbuffer_t *bb, const bitvector_t *bv)
Append all bits from a bit vector.
int bitbuffer_append_bits(bitbuffer_t *bb, const uint8_t *data, size_t num_bits)
Append multiple bits from byte array.
int bitbuffer_append_value(bitbuffer_t *bb, uint32_t value, size_t num_bits)
Append multiple bits from a value in a single operation.
int bitbuffer_append_bit(bitbuffer_t *bb, int bit)
Append a single bit to buffer.
void bitbuffer_clear(bitbuffer_t *bb)
Clear bit buffer contents.
void bitbuffer_init(bitbuffer_t *bb)
Initialize bit buffer to empty state.
size_t bitbuffer_size(const bitbuffer_t *bb)
Get number of bits in buffer.
size_t bitbuffer_to_bytes(const bitbuffer_t *bb, uint8_t *data, size_t max_bytes)
Convert bit buffer to byte array.
static int bitvector_get_bit(const bitvector_t *bv, size_t pos)
Get bit value at position (inline for performance).
#define CCSDS124_MAX_OUTPUT_BYTES
#define CCSDS124_ERROR_OVERFLOW
#define CCSDS124_ERROR_INVALID_ARG
Variable-length bit buffer structure.
uint8_t data[CCSDS124_MAX_OUTPUT_BYTES]
Fixed-length bit vector structure.