4 #include <osmocom/core/bits.h>
6 /* convert unpacked bits to packed bits, return length in bytes */
7 int osmo_ubit2pbit(pbit_t *out, const ubit_t *in, unsigned int num_bits)
13 for (i = 0; i < num_bits; i++) {
14 uint8_t bitnum = 7 - (i % 8);
16 curbyte |= (in[i] << bitnum);
23 /* we have a non-modulo-8 bitcount */
30 /* convert packed bits to unpacked bits, return length in bytes */
31 int osmo_pbit2ubit(ubit_t *out, const pbit_t *in, unsigned int num_bits)
35 ubit_t *limit = out + num_bits;
37 for (i = 0; i < (num_bits/8)+1; i++) {
39 *cur++ = (byte >> 7) & 1;
42 *cur++ = (byte >> 6) & 1;
45 *cur++ = (byte >> 5) & 1;
48 *cur++ = (byte >> 4) & 1;
51 *cur++ = (byte >> 3) & 1;
54 *cur++ = (byte >> 2) & 1;
57 *cur++ = (byte >> 1) & 1;
60 *cur++ = (byte >> 0) & 1;
67 /* convert unpacked bits to packed bits (extended options but slower),
68 * return length in bytes (max written ofs of output buffer + 1) */
69 int osmo_ubit2pbit_ext(pbit_t *out, unsigned int out_ofs,
70 const ubit_t *in, unsigned int in_ofs,
71 unsigned int num_bits, int lsb_mode)
74 for (i=0; i<num_bits; i++) {
76 bn = lsb_mode ? (op&7) : (7-(op&7));
78 out[op>>3] |= 1 << bn;
80 out[op>>3] &= ~(1 << bn);
82 return ((out_ofs + num_bits - 1) >> 3) + 1;
85 /* convert packed bits to unpacked bits (extended options but slower),
86 * return length in bytes (max written ofs of output buffer + 1) */
87 int osmo_pbit2ubit_ext(ubit_t *out, unsigned int out_ofs,
88 const pbit_t *in, unsigned int in_ofs,
89 unsigned int num_bits, int lsb_mode)
92 for (i=0; i<num_bits; i++) {
94 bn = lsb_mode ? (ip&7) : (7-(ip&7));
95 out[out_ofs+i] = !!(in[ip>>3] & (1<<bn));
97 return out_ofs + num_bits;