I've made this simple function for reading N bits from an unsigned char*
(with a possible offset) and I'm willing to share it here, get a review, suggestions for improving it, etc...
typedef struct bits_t {
unsigned char *data;
unsigned int len;
} bits_t;
bits_t *read_bits(unsigned char *src, int bits_offset, int nbits){
unsigned int curr_bit, curr_byte, remaining_to_read, bit_position_in_byte;
curr_bit = curr_byte = 0;
remaining_to_read = nbits;
bits_t *bits = malloc(sizeof(bits_t));
bits->len = nbits;
bits->data = calloc(1, bits->len);
for(curr_bit = 1; curr_bit <= nbits; curr_bit++){
if(curr_bit >= bits_offset && remaining_to_read){
curr_byte = (curr_bit - 1) / 8;
bit_position_in_byte = (curr_bit - 1) - (curr_byte * 8);
bits->data[remaining_to_read - 1] = read_bit(src[curr_byte], bit_position_in_byte);
remaining_to_read--;
}
}
return bits;
}
Main:
unsigned char *x = "oo";
bits_t *bits = read_bits(x, 0, 16);
for(i = 0; i < bits->len; i++){
printf("%d", bits->data[i]);
}
Result: 0110111101101111
read_bit
implementation seems to be missing. Is it a macro or an actual function? \$\endgroup\$size_t
rather thanunsigned int
forlen
andnbits
. Maybe alsobits_offset
. \$\endgroup\$