libosmocore 1.11.0.23-fd0d
Osmocom core library
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
soft, unpacked and packed bits

Osmocom bit level support code. More...

Files

file  bits.h
 Osmocom bit level support code.
 
file  bits.c
 

Macros

#define OSMO_BIN_SPEC   "%d%d%d%d%d%d%d%d"
 
#define OSMO_BIN_PRINT(byte)
 
#define OSMO_BIT_SPEC   "%c%c%c%c%c%c%c%c"
 
#define OSMO_BIT_PRINT_EX(byte, ch)
 
#define OSMO_BIT_PRINT(byte)   OSMO_BIT_PRINT_EX(byte, '1')
 

Typedefs

typedef int8_t sbit_t
 soft bit with value (-127...127), as commonly used in communications receivers such as [viterbi] decoders More...
 
typedef uint8_t ubit_t
 unpacked bit (0 or 1): 1 bit per byte More...
 
typedef uint8_t pbit_t
 packed bits (8 bits in a byte). More...
 

Enumerations

enum  osmo_br_mode {
  OSMO_BR_BITS_IN_DWORD = 31 ,
  OSMO_BR_BYTES_IN_DWORD = 24 ,
  OSMO_BR_BITS_IN_BYTE = 7 ,
  OSMO_BR_WORD_SWAP = 16
}
 bit-reversal mode for osmo_bit_reversal() More...
 

Functions

static unsigned int osmo_pbit_bytesize (unsigned int num_bits)
 determine how many bytes we would need for num_bits packed bits More...
 
int osmo_ubit2pbit (pbit_t *out, const ubit_t *in, unsigned int num_bits)
 convert unpacked bits to packed bits, return length in bytes More...
 
int osmo_pbit2ubit (ubit_t *out, const pbit_t *in, unsigned int num_bits)
 convert packed bits to unpacked bits, return length in bytes More...
 
void osmo_nibble_shift_right (uint8_t *out, const uint8_t *in, unsigned int num_nibbles)
 Shift unaligned input to octet-aligned output. More...
 
void osmo_nibble_shift_left_unal (uint8_t *out, const uint8_t *in, unsigned int num_nibbles)
 Shift unaligned input to octet-aligned output. More...
 
void osmo_ubit2sbit (sbit_t *out, const ubit_t *in, unsigned int num_bits)
 convert unpacked bits to soft bits More...
 
void osmo_sbit2ubit (ubit_t *out, const sbit_t *in, unsigned int num_bits)
 convert soft bits to unpacked bits More...
 
int osmo_ubit2pbit_ext (pbit_t *out, unsigned int out_ofs, const ubit_t *in, unsigned int in_ofs, unsigned int num_bits, int lsb_mode)
 convert unpacked bits to packed bits (extended options) More...
 
int osmo_pbit2ubit_ext (ubit_t *out, unsigned int out_ofs, const pbit_t *in, unsigned int in_ofs, unsigned int num_bits, int lsb_mode)
 convert packed bits to unpacked bits (extended options) More...
 
uint32_t osmo_bit_reversal (uint32_t x, enum osmo_br_mode k)
 generalized bit reversal function More...
 
uint32_t osmo_revbytebits_32 (uint32_t x)
 reverse the bit-order in each byte of a dword More...
 
uint32_t osmo_revbytebits_8 (uint8_t x)
 reverse the bit order in a byte More...
 
void osmo_revbytebits_buf (uint8_t *buf, int len)
 reverse bit-order of each byte in a buffer More...
 
static uint16_t osmo_rol16 (uint16_t in, unsigned shift)
 left circular shift More...
 

Variables

static const uint8_t flip_table [256]
 

Detailed Description

Osmocom bit level support code.

This module implements the notion of different bit-fields, such as

Macro Definition Documentation

◆ OSMO_BIN_PRINT

#define OSMO_BIN_PRINT (   byte)
Value:
(byte & 0x80 ? 1 : 0), \
(byte & 0x40 ? 1 : 0), \
(byte & 0x20 ? 1 : 0), \
(byte & 0x10 ? 1 : 0), \
(byte & 0x08 ? 1 : 0), \
(byte & 0x04 ? 1 : 0), \
(byte & 0x02 ? 1 : 0), \
(byte & 0x01 ? 1 : 0)

◆ OSMO_BIN_SPEC

#define OSMO_BIN_SPEC   "%d%d%d%d%d%d%d%d"

◆ OSMO_BIT_PRINT

#define OSMO_BIT_PRINT (   byte)    OSMO_BIT_PRINT_EX(byte, '1')

◆ OSMO_BIT_PRINT_EX

#define OSMO_BIT_PRINT_EX (   byte,
  ch 
)
Value:
(byte & 0x80 ? ch : '.'), \
(byte & 0x40 ? ch : '.'), \
(byte & 0x20 ? ch : '.'), \
(byte & 0x10 ? ch : '.'), \
(byte & 0x08 ? ch : '.'), \
(byte & 0x04 ? ch : '.'), \
(byte & 0x02 ? ch : '.'), \
(byte & 0x01 ? ch : '.')

◆ OSMO_BIT_SPEC

#define OSMO_BIT_SPEC   "%c%c%c%c%c%c%c%c"

Typedef Documentation

◆ pbit_t

typedef uint8_t pbit_t

packed bits (8 bits in a byte).

NOTE on the endian-ness of pbit_t:

  • Bits in a pbit_t are ordered MSB first, i.e. 0x80 is the first bit.
  • Bit i in a pbit_t array is array[i/8] & (1<<(7-i%8))

◆ sbit_t

typedef int8_t sbit_t

soft bit with value (-127...127), as commonly used in communications receivers such as [viterbi] decoders

◆ ubit_t

typedef uint8_t ubit_t

unpacked bit (0 or 1): 1 bit per byte

Enumeration Type Documentation

◆ osmo_br_mode

bit-reversal mode for osmo_bit_reversal()

Enumerator
OSMO_BR_BITS_IN_DWORD 

reverse all bits in a 32bit dword

OSMO_BR_BYTES_IN_DWORD 

reverse byte order in a 32bit dword

OSMO_BR_BITS_IN_BYTE 

reverse bits of each byte in a 32bit dword

OSMO_BR_WORD_SWAP 

swap the two 16bit words in a 32bit dword

Function Documentation

◆ osmo_bit_reversal()

uint32_t osmo_bit_reversal ( uint32_t  x,
enum osmo_br_mode  k 
)

generalized bit reversal function

Parameters
[in]xthe 32bit value to be reversed
[in]kthe type of reversal requested
Returns
the reversed 32bit dword

This function reverses the bit order within a 32bit word. Depending on "k", it either reverses all bits in a 32bit dword, or the bytes in the dword, or the bits in each byte of a dword, or simply swaps the two 16bit words in a dword. See Chapter 7 "Hackers Delight"

References k, and x.

◆ osmo_nibble_shift_left_unal()

void osmo_nibble_shift_left_unal ( uint8_t *  out,
const uint8_t *  in,
unsigned int  num_nibbles 
)

Shift unaligned input to octet-aligned output.

Parameters
[out]outoutput buffer, octet-aligned
[in]ininput buffer, unaligned
[in]num_nibblesnumber of nibbles

◆ osmo_nibble_shift_right()

void osmo_nibble_shift_right ( uint8_t *  out,
const uint8_t *  in,
unsigned int  num_nibbles 
)

Shift unaligned input to octet-aligned output.

Parameters
[out]outoutput buffer, unaligned
[in]ininput buffer, octet-aligned
[in]num_nibblesnumber of nibbles

◆ osmo_pbit2ubit()

int osmo_pbit2ubit ( ubit_t out,
const pbit_t in,
unsigned int  num_bits 
)

convert packed bits to unpacked bits, return length in bytes

Parameters
[out]outoutput buffer of unpacked bits
[in]ininput buffer of packed bits
[in]num_bitsnumber of bits
Returns
number of bytes used in out

◆ osmo_pbit2ubit_ext()

int osmo_pbit2ubit_ext ( ubit_t out,
unsigned int  out_ofs,
const pbit_t in,
unsigned int  in_ofs,
unsigned int  num_bits,
int  lsb_mode 
)

convert packed bits to unpacked bits (extended options)

Parameters
[out]outoutput buffer of unpacked bits
[in]out_ofsoffset into output buffer
[in]ininput buffer of packed bits
[in]in_ofsoffset into input buffer
[in]num_bitsnumber of bits
[in]lsb_modeEncode bits in LSB order instead of MSB
Returns
length in bytes (max written offset of output buffer + 1)

◆ osmo_pbit_bytesize()

static unsigned int osmo_pbit_bytesize ( unsigned int  num_bits)
inlinestatic

determine how many bytes we would need for num_bits packed bits

Parameters
[in]num_bitsNumber of packed bits
Returns
number of bytes needed for num_bits packed bits

◆ osmo_revbytebits_32()

uint32_t osmo_revbytebits_32 ( uint32_t  x)

reverse the bit-order in each byte of a dword

Parameters
[in]x32bit input value
Returns
32bit value where bits of each byte have been reversed

See Chapter 7 "Hackers Delight"

References x.

◆ osmo_revbytebits_8()

uint32_t osmo_revbytebits_8 ( uint8_t  x)

reverse the bit order in a byte

Parameters
[in]x8bit input value
Returns
8bit value where bits order has been reversed

References flip_table, and x.

Referenced by osmo_isdnhdlc_decode(), and osmo_isdnhdlc_encode().

◆ osmo_revbytebits_buf()

void osmo_revbytebits_buf ( uint8_t *  buf,
int  len 
)

reverse bit-order of each byte in a buffer

Parameters
[in]bufbuffer containing bytes to be bit-reversed
[in]lenlength of buffer in bytes

This function reverses the bits in each byte of the buffer

References flip_table, and len().

◆ osmo_rol16()

static uint16_t osmo_rol16 ( uint16_t  in,
unsigned  shift 
)
inlinestatic

left circular shift

Parameters
[in]inThe 16 bit unsigned integer to be rotated
[in]shiftNumber of bits to shift in to, [0;16] bits
Returns
shifted value

◆ osmo_sbit2ubit()

void osmo_sbit2ubit ( ubit_t out,
const sbit_t in,
unsigned int  num_bits 
)

convert soft bits to unpacked bits

Parameters
[out]outoutput buffer of unpacked bits
[in]ininput buffer of soft bits
[in]num_bitsnumber of bits

◆ osmo_ubit2pbit()

int osmo_ubit2pbit ( pbit_t out,
const ubit_t in,
unsigned int  num_bits 
)

convert unpacked bits to packed bits, return length in bytes

Parameters
[out]outoutput buffer of packed bits
[in]ininput buffer of unpacked bits
[in]num_bitsnumber of bits

◆ osmo_ubit2pbit_ext()

int osmo_ubit2pbit_ext ( pbit_t out,
unsigned int  out_ofs,
const ubit_t in,
unsigned int  in_ofs,
unsigned int  num_bits,
int  lsb_mode 
)

convert unpacked bits to packed bits (extended options)

Parameters
[out]outoutput buffer of packed bits
[in]out_ofsoffset into output buffer
[in]ininput buffer of unpacked bits
[in]in_ofsoffset into input buffer
[in]num_bitsnumber of bits
[in]lsb_modeEncode bits in LSB order instead of MSB
Returns
length in bytes (max written offset of output buffer + 1)

◆ osmo_ubit2sbit()

void osmo_ubit2sbit ( sbit_t out,
const ubit_t in,
unsigned int  num_bits 
)

convert unpacked bits to soft bits

Parameters
[out]outoutput buffer of soft bits
[in]ininput buffer of unpacked bits
[in]num_bitsnumber of bits

Variable Documentation

◆ flip_table

const uint8_t flip_table[256]
static
Initial value:
= {
0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4, 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2, 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea, 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1, 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5, 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed, 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb, 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7, 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff,
}

Referenced by osmo_revbytebits_8(), and osmo_revbytebits_buf().