Skip to content

Commit 5f892de

Browse files
committed
add bit reader module
0 parents  commit 5f892de

File tree

2 files changed

+98
-0
lines changed

2 files changed

+98
-0
lines changed

bit_reader.c

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
/*
2+
* @file bit_reader.c
3+
* @author Fabjan Sukalia <[email protected]>
4+
* @date 2016-02-03
5+
*/
6+
7+
#include <stdlib.h>
8+
#include <assert.h>
9+
#include "bit_reader.h"
10+
11+
struct bit_reader {
12+
FILE *file;
13+
uint8_t buffer;
14+
uint8_t bit_pos;
15+
};
16+
17+
struct bit_reader *bit_reader_create(FILE *in)
18+
{
19+
struct bit_reader *reader = calloc(1, sizeof(*reader));
20+
reader->file = in;
21+
return reader;
22+
}
23+
24+
void bit_reader_destroy(struct bit_reader *reader)
25+
{
26+
free(reader);
27+
}
28+
29+
bool bit_reader_next_bit(struct bit_reader *reader, uint8_t *bit)
30+
{
31+
assert(reader != NULL);
32+
assert(bit != NULL);
33+
34+
if (reader->bit_pos == 0) {
35+
/* read next byte */
36+
uint8_t data;
37+
if (fread(&data, sizeof(data), 1, reader->file) != sizeof(data))
38+
return false;
39+
40+
if (data == 0xFF) {
41+
/* possible marker - check next byte */
42+
if (fread(&data, sizeof(data), 1, reader->file) != sizeof(data))
43+
return false;
44+
45+
if (data != 0)
46+
return false;
47+
}
48+
49+
*bit = data & 0x01;
50+
reader->buffer = data >> 1;
51+
reader->bit_pos = 7;
52+
return true;
53+
}
54+
55+
*bit = reader->buffer & 0x01;
56+
reader->buffer >>= 1;
57+
reader->bit_pos--;
58+
return true;
59+
}
60+
61+
bool bit_reader_next_bits(struct bit_reader *reader, uint16_t *bits, uint8_t num)
62+
{
63+
assert(reader != NULL);
64+
assert(bits != NULL);
65+
assert(num <= 16);
66+
67+
uint8_t tmp = 0;
68+
69+
for (int i = 0; i < num; i++) {
70+
uint8_t bit;
71+
if (!bit_reader_next_bit(reader, &bit))
72+
return false;
73+
74+
tmp = (tmp << 1) | (bit & 0x01);
75+
}
76+
77+
*bits = tmp;
78+
return true;
79+
}
80+

bit_reader.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/*
2+
* @file bit_reader.h
3+
* @author Fabjan Sukalia <[email protected]>
4+
* @date 2016-02-03
5+
* @brief Module to read bitwise from a file.
6+
*/
7+
8+
#include <stdio.h>
9+
#include <stdint.h>
10+
#include <stdbool.h>
11+
12+
struct bit_reader;
13+
14+
struct bit_reader *bit_reader_create(FILE *in);
15+
void bit_reader_destroy(struct bit_reader *reader);
16+
bool bit_reader_next_bit(struct bit_reader *reader, uint8_t *bit);
17+
bool bit_reader_next_bits(struct bit_reader *reader, uint16_t *bits, uint8_t num);
18+

0 commit comments

Comments
 (0)