| Type: | Package | 
| Title: | Read and Write Bits from Files, Connections and Raw Vectors | 
| Version: | 0.1.0 | 
| Maintainer: | Mike Cheng <mikefc@coolbutuseless.com> | 
| URL: | https://github.com/coolbutuseless/bitstreamio | 
| BugReports: | https://github.com/coolbutuseless/bitstreamio/issues | 
| Description: | Bit-level reading and writing are necessary when dealing with many file formats e.g. compressed data and binary files. Currently, R connections are manipulated at the byte level. This package wraps existing connections and raw vectors so that it is possible to read bits, bit sequences, unaligned bytes and low-bit representations of integers. | 
| License: | MIT + file LICENSE | 
| Encoding: | UTF-8 | 
| RoxygenNote: | 7.3.2 | 
| Suggests: | knitr, rmarkdown, testthat (≥ 3.0.0) | 
| Config/testthat/edition: | 3 | 
| VignetteBuilder: | knitr | 
| NeedsCompilation: | no | 
| Packaged: | 2025-01-13 09:07:43 UTC; mike | 
| Author: | Mike Cheng [aut, cre, cph] | 
| Repository: | CRAN | 
| Date/Publication: | 2025-01-14 13:20:01 UTC | 
Test if an object is a bitstream object and fail if it is not
Description
Test if an object is a bitstream object and fail if it is not
Usage
assert_bs(x)
Arguments
| x | object to test | 
Value
None
Examples
raw_vec <- as.raw(1:3)
bs  <- bs_open(raw_vec, 'r')
assert_bs(bs)
bs_close(bs)
Convert between logical vector of bits and raw vector
Description
Convert between logical vector of bits and raw vector
Usage
bits_to_raw(bits, msb_first = TRUE)
raw_to_bits(x, msb_first = TRUE)
Arguments
| bits | Logical vector of bit values. Length must be a multiple of 8 | 
| msb_first | MSB first? Default: TRUE | 
| x | Byte values. Integer vectors will be truncated to 8 bits before output. Numeric vectors will be rounded to integers and then truncated to 8 bits. Raw vectors preferred. | 
Value
Logical vector of bit values or a raw vector.
Examples
bits <- raw_to_bits(c(0, 4, 21))
bits
bits_to_raw(bits) |> as.integer()
Convert between bits and unsigned integers
Description
Convert between bits and unsigned integers
Usage
bits_to_uint(bits, nbits = NULL)
uint_to_bits(x, nbits)
Arguments
| bits | logical vector of bit values in MSB first order | 
| nbits | number of bits per integer. If NULL, then  | 
| x | vector of unsigned integers | 
Value
logical vector of bit values of vector of unsigned integers
Examples
bits <- uint_to_bits(c(1, 2, 3), nbits = 3)
bits
bits_to_uint(bits, nbits = 3)
Advance bitstream
Description
Advance bitstream
Usage
bs_advance(bs, n)
Arguments
| bs | Bistream connection object created with  | 
| n | number of bits to advance | 
Value
Bitstream connection returned invisibly
Examples
raw_vec <- as.raw(1:3)
bs  <- bs_open(raw_vec, 'r')
bs_is_aligned(bs)
bs_advance(bs, 4)
bs_is_aligned(bs)
bs_read_bit(bs, 8)
bs_is_aligned(bs)
bs_close(bs)
Align the bitstream to the given number of bits - relative to start of bitstream
Description
Align the bitstream to the given number of bits - relative to start of bitstream
Usage
bs_align(bs, nbits = 8L, value = FALSE)
Arguments
| bs | Bistream connection object created with  | 
| nbits | number of bits of alignment w.r.t start of bitstream. Default: 8 | 
| value | bit fill value. Either TRUE or FALSE. Default FALSE | 
Value
Bitstream connection returned invisibly
Examples
bs  <- bs_open(raw(), 'w')
bs_write_bit(bs, c(TRUE, FALSE, TRUE))
bs_is_aligned(bs, 8)
bs_align(bs, nbits = 8)
bs_is_aligned(bs, 8)
output <- bs_close(bs)
output
Flush bits in the buffer
Description
This is called internally to flush bitstream buffers to the underlying R connection.
Usage
bs_flush(bs)
Arguments
| bs | Bistream connection object created with  | 
Value
Bitstream connection returned invisibly
Examples
bs  <- bs_open(raw(), 'w')
bs_write_bit(bs, c(TRUE, FALSE, TRUE))
bs_align(bs, nbits = 8)
bs_flush(bs)
output <- bs_close(bs)
output
Is the current bit connection aligned at the given number of bits for reading/writing?
Description
Is the current bit connection aligned at the given number of bits for reading/writing?
Usage
bs_is_aligned(bs, nbits = 8)
Arguments
| bs | Bistream connection object created with  | 
| nbits | number of bits of alignment w.r.t start of bitstream. Default: 8 | 
Value
logical. TRUE if stream location is currently aligned to the specified number of bits, otherwise FALSE
Examples
bs  <- bs_open(raw(), 'w')
bs_write_bit(bs, c(TRUE, FALSE, TRUE))
bs_is_aligned(bs, 8)
bs_align(bs, nbits = 8)
bs_is_aligned(bs, 8)
output <- bs_close(bs)
output
Open/close a bitstream
Description
Open/close a bitstream
Usage
bs_open(con, mode, msb_first = TRUE, flush_threshold = 1024 * 8)
bs_close(bs, verbosity = 0)
Arguments
| con | A vector of raw values or an R connection (e.g.  | 
| mode | Bitstream mode set to read or write? One of 'r', 'w', 'rb', 'wb'. | 
| msb_first | Should the output mode be Most Signficant Bit first? Default: TRUE | 
| flush_threshold | Threshold number of bits at which the buffered data
will be automatically written to the connection. 
Default: 8192 bits (1024 bytes).  Note: Use  | 
| bs | Bistream connection object created with  | 
| verbosity | Verbosity level. Default: 0 | 
Value
bs_open() returns a bitstream connection object. When the 
connection is a raw vector and mode = 'w', bs_close() returns 
the final state of the raw vector; in all other cases bs_close()
does not return a value.
Examples
raw_vec <- as.raw(1:3)
bs  <- bs_open(raw_vec, 'r')
assert_bs(bs)
bs_close(bs)
Peek at bits from a bitstream i.e. examine bits without advancing bitstream
Description
Peek at bits from a bitstream i.e. examine bits without advancing bitstream
Usage
bs_peek(bs, n)
Arguments
| bs | Bistream connection object created with  | 
| n | number of bits to peek. | 
Value
logical vector of bit values
Examples
raw_vec <- as.raw(1:3)
bs  <- bs_open(raw_vec, 'r')
bs_peek(bs, 4)
stopifnot(bs_is_aligned(bs))
bs_close(bs)
Read bits from a bitstream
Description
Read bits from a bitstream
Usage
bs_read_bit(bs, n)
Arguments
| bs | Bistream connection object created with  | 
| n | number of bits to read | 
Value
logical vector of bit values
Examples
raw_vec <- as.raw(1:3)
bs  <- bs_open(raw_vec, 'r')
bs_read_bit(bs, 4)
bs_is_aligned(bs)
bs_close(bs)
Write unaligned bits to a bitstream
Description
Write unaligned bits to a bitstream
Usage
bs_write_bit(bs, x)
Arguments
| bs | Bistream connection object created with  | 
| x | Logical vector of bit values | 
Value
Bitstream connection returned invisibly
Examples
bs  <- bs_open(raw(), 'w')
bs_write_bit(bs, c(TRUE, FALSE, TRUE))
bs_align(bs, nbits = 8)
bs_flush(bs) 
output <- bs_close(bs)
output
Read/Write unaligned bytes with a bitstream
Description
Read/Write unaligned bytes with a bitstream
Usage
bs_write_byte(bs, x)
bs_read_byte(bs, n)
Arguments
| bs | Bistream connection object created with  | 
| x | vector of bytes to write. Integer vectors will be truncated to 8 bits before output. Numeric vectors will be rounded to integers and then truncated to 8 bits. | 
| n | number of bytes to read | 
Value
Reading returns a logical vector of bit values.  When writing, 
the bs 
bitstream connection is returned invisibly
Examples
bs  <- bs_open(raw(), 'w')
bs_write_bit(bs, c(TRUE, FALSE))
bs_write_byte(bs, c(1, 2, 3))
bs_align(bs)
raw_vec <- bs_close(bs)
bs  <- bs_open(raw_vec, 'r')
bs_read_bit(bs, 2)
bs_read_byte(bs, 3)
bs_close(bs)
Read/Write Exponential-Golomb encoded signed integers
Description
Read/Write Exponential-Golomb encoded signed integers
Usage
bs_write_sint_exp_golomb(bs, x)
bs_read_sint_exp_golomb(bs, n = 1L)
Arguments
| bs | Bistream connection object created with  | 
| x | integer vector to write | 
| n | number of encoded integers to read | 
Value
Reading returns a vector of integers. Writing returns the bitstream invisibly.
Examples
bs  <- bs_open(raw(), 'w')
bs_write_sint_exp_golomb(bs, c(0, 4, -21))
raw_vec <- bs_close(bs)
raw_vec
bs  <- bs_open(raw_vec, 'r')
bs_read_sint_exp_golomb(bs, 3)
bs_close(bs)
Read/Write unsigned integers
Description
Read/Write unsigned integers
Usage
bs_write_uint(bs, x, nbits)
bs_read_uint(bs, nbits, n = 1L)
Arguments
| bs | Bistream connection object created with  | 
| x | integer vector to write | 
| nbits | the number of bits used for each integer | 
| n | number of integers to read | 
Value
Reading returns a vector of non-negative integers. Writing returns the bitstream invisibly.
Examples
bs  <- bs_open(raw(), 'w')
bs_write_uint(bs, c(0, 4, 21), nbits = 5)
bs_align(bs, 8)
raw_vec <- bs_close(bs)
raw_vec
bs  <- bs_open(raw_vec, 'r')
bs_read_uint(bs, n = 3, nbits = 5)
bs_close(bs)
Read/Write Exponential-Golomb encoded non-negative integers
Description
Read/Write Exponential-Golomb encoded non-negative integers
Usage
bs_write_uint_exp_golomb(bs, x)
bs_read_uint_exp_golomb(bs, n = 1L)
Arguments
| bs | Bistream connection object created with  | 
| x | integer vector to write | 
| n | number of encoded integers to read | 
Value
Reading returns a vector of non-negative integers. Writing returns the bitstream invisibly.
Examples
bs  <- bs_open(raw(), 'w')
bs_write_uint_exp_golomb(bs, c(0, 4, 21))
bs_align(bs, 8)
raw_vec <- bs_close(bs)
raw_vec
bs  <- bs_open(raw_vec, 'r')
bs_read_uint_exp_golomb(bs, 3)
bs_close(bs)
Test if an object is a bitstream object
Description
Test if an object is a bitstream object
Usage
is_bs(x)
Arguments
| x | object to test | 
Value
logical. TRUE if object is a bitstream object
Examples
# Negative case
is_bs(NULL)
# Positive case
raw_vec <- as.raw(1:3)
bs  <- bs_open(raw_vec, 'r')
is_bs(bs)
bs_close(bs)
Pad a logical vector to the given size
Description
Pad a logical vector to the given size
Usage
pad_bits(bits, nbits = 8L, side = "left", value = FALSE)
Arguments
| bits | logical vector | 
| nbits | Pad width to a multiple of this number of bits | 
| side | 'left' or 'right'. Only the lowercase version of the first letter is used to determine the side. all of these are valid options: 'L', 'R', 'left', 'Right' | 
| value | The value to use for padding. single logical value. Default: FALSE | 
Value
Logical vector with the specified padding
Examples
pad_bits(c(TRUE, TRUE), nbits = 8, side = 'left')
pad_bits(c(TRUE, TRUE), nbits = 8, side = 'R')
Convert between signed integers and Exponential-Golomb bit sequences
Description
Convert between signed integers and Exponential-Golomb bit sequences
Usage
sint_to_exp_golomb_bits(x)
exp_golomb_bits_to_sint(bits, n = 1)
Arguments
| x | integer vector with all values >= 0 | 
| bits | logical vector of bit values | 
| n | number of values to decode. Default: 1. Set to 'Inf' to decode all bits. Will raise an error if there are extra bits at the end that are unused. | 
Value
logical vector of bit values, or vector of signed integers
Examples
bits <- sint_to_exp_golomb_bits(c(0, 4, -21))
bits
exp_golomb_bits_to_sint(bits, n = 3)
Convert between non-negative integers and Exponential Golomb bit sequences
Description
Convert between non-negative integers and Exponential Golomb bit sequences
Usage
uint_to_exp_golomb_bits(x)
exp_golomb_bits_to_uint(bits, n = 1)
Arguments
| x | integer vector with all values >= 0 | 
| bits | logical vector of bit values | 
| n | number of values to decode. Default: 1. Set to 'Inf' to decode all bits. Will raise an error if there are extra bits at the end that are not properly encoded integers | 
Value
logical vector of bit values, or vector of non-negative integers
Examples
bits <- uint_to_exp_golomb_bits(c(0, 4, 21))
bits
exp_golomb_bits_to_uint(bits, n = 3)