blob: fb3c7224047bc9692a30b8cd1058cf2022880880 [file] [log] [blame]
Harald Welte2230c132011-01-19 10:10:16 +01001
2#include <stdint.h>
3
4#include <osmocore/bits.h>
5
6/* convert unpacked bits to packed bits, return length in bytes */
7int osmo_ubit2pbit(pbit_t *out, const ubit_t *in, unsigned int num_bits)
8{
9 unsigned int i;
10 uint8_t curbyte = 0;
11 pbit_t *outptr = out;
12
13 for (i = 0; i < num_bits; i++) {
14 uint8_t bitnum = 7 - (i % 8);
15
16 curbyte |= (in[i] << bitnum);
17
18 if (i > 0 && i % 8 == 0) {
19 *outptr++ = curbyte;
20 curbyte = 0;
21 }
22 }
23 /* we have a non-modulo-8 bitcount */
24 if (i % 8)
25 *outptr++ = curbyte;
26
27 return outptr - out;
28}
29
30/* convert packed bits to unpacked bits, return length in bytes */
31int osmo_pbit2ubit(ubit_t *out, const pbit_t *in, unsigned int num_bits)
32{
33 unsigned int i;
34 ubit_t *cur = out;
35 ubit_t *limit = out + num_bits;
36
37 for (i = 0; i < (num_bits/8)+1; i++) {
38 pbit_t byte = in[i];
39 *cur++ = (byte >> 7) & 1;
40 if (cur >= limit)
41 break;
42 *cur++ = (byte >> 6) & 1;
43 if (cur >= limit)
44 break;
45 *cur++ = (byte >> 5) & 1;
46 if (cur >= limit)
47 break;
48 *cur++ = (byte >> 4) & 1;
49 if (cur >= limit)
50 break;
51 *cur++ = (byte >> 3) & 1;
52 if (cur >= limit)
53 break;
54 *cur++ = (byte >> 2) & 1;
55 if (cur >= limit)
56 break;
57 *cur++ = (byte >> 1) & 1;
58 if (cur >= limit)
59 break;
60 *cur++ = (byte >> 0) & 1;
61 if (cur >= limit)
62 break;
63 }
64 return cur - out;
65}