pub struct BitReader<R, E: Endianness> { /* private fields */ }
Expand description
For reading non-aligned bits from a stream of bytes in a given endianness.
This will read exactly as many whole bytes needed to return the requested number of bits. It may cache up to a single partial byte but no more.
Implementations§
Source§impl<R, E: Endianness> BitReader<R, E>
impl<R, E: Endianness> BitReader<R, E>
Sourcepub fn new(reader: R) -> BitReader<R, E>
pub fn new(reader: R) -> BitReader<R, E>
Wraps a BitReader around something that implements Read
Sourcepub fn endian(reader: R, _endian: E) -> BitReader<R, E>
pub fn endian(reader: R, _endian: E) -> BitReader<R, E>
Wraps a BitReader around something that implements Read
with the given endianness.
Examples found in repository?
90fn main() {
91 // test FLAC file data
92 let flac = include_bytes!("data/metadata-only.flac");
93
94 let mut reader = BitReader::endian(flac.as_slice(), BigEndian);
95
96 // stream marker
97 assert_eq!(&reader.read_to::<[u8; 4]>().unwrap(), b"fLaC");
98
99 // metadata block header
100 assert_eq!(
101 reader.parse::<BlockHeader>().unwrap(),
102 BlockHeader {
103 last_block: false,
104 block_type: 0,
105 block_size: 34
106 }
107 );
108
109 // STREAMINFO block
110 assert_eq!(
111 dbg!(reader.parse::<Streaminfo>().unwrap()),
112 Streaminfo {
113 minimum_block_size: 4096,
114 maximum_block_size: 4096,
115 minimum_frame_size: 1542,
116 maximum_frame_size: 8546,
117 sample_rate: 44100,
118 channels: NonZero::new(2).unwrap(),
119 bits_per_sample: NonZero::new(16).unwrap(),
120 total_samples: 304844,
121 md5: *b"\xFA\xF2\x69\x2F\xFD\xEC\x2D\x5B\x30\x01\x76\xB4\x62\x88\x7D\x92",
122 }
123 );
124
125 // metadata block header
126 assert_eq!(
127 dbg!(reader.parse::<BlockHeader>().unwrap()),
128 BlockHeader {
129 last_block: false,
130 block_type: 4,
131 block_size: 122
132 }
133 );
134
135 // VORBIS_COMMENT block
136 assert_eq!(
137 dbg!(reader.parse::<VorbisComment>().unwrap()),
138 VorbisComment {
139 vendor: "reference libFLAC 1.1.4 20070213".to_string(),
140 comment: vec![
141 "title=2ch 44100 16bit".to_string(),
142 "album=Test Album".to_string(),
143 "artist=Assorted".to_string(),
144 "tracknumber=1".to_string(),
145 ],
146 }
147 );
148}
Sourcepub fn into_reader(self) -> R
pub fn into_reader(self) -> R
Source§impl<R: Read, E: Endianness> BitReader<R, E>
impl<R: Read, E: Endianness> BitReader<R, E>
Sourcepub fn reader(&mut self) -> Option<&mut R>
pub fn reader(&mut self) -> Option<&mut R>
If stream is byte-aligned, provides mutable reference
to internal reader. Otherwise returns None
Sourcepub fn aligned_reader(&mut self) -> &mut R
pub fn aligned_reader(&mut self) -> &mut R
Returns byte-aligned mutable reference to internal reader.
Bytes aligns stream if it is not already aligned.
Sourcepub fn into_bytereader(self) -> ByteReader<R, E>
pub fn into_bytereader(self) -> ByteReader<R, E>
Converts BitReader
to ByteReader
in the same endianness.
§Warning
Any unread partial bits are discarded.
Sourcepub fn bytereader(&mut self) -> Option<ByteReader<&mut R, E>>
pub fn bytereader(&mut self) -> Option<ByteReader<&mut R, E>>
If stream is byte-aligned, provides temporary ByteReader
in the same endianness. Otherwise returns None
§Warning
Any reader bits left over when ByteReader
is dropped are lost.
Source§impl<R, E> BitReader<R, E>
impl<R, E> BitReader<R, E>
Sourcepub fn seek_bits(&mut self, from: SeekFrom) -> Result<u64>
pub fn seek_bits(&mut self, from: SeekFrom) -> Result<u64>
§Example
use std::io::{Read, Cursor, SeekFrom};
use bitstream_io::{BigEndian, BitReader, BitRead};
let data = [0x00, 0xFF];
let mut reader = BitReader::endian(Cursor::new(&data), BigEndian);
assert_eq!(reader.position_in_bits().unwrap(), 0);
let pos = reader.seek_bits(SeekFrom::Start(5)).unwrap();
assert!(pos == 5 && 5 == reader.position_in_bits().unwrap());
let pos = reader.seek_bits(SeekFrom::Current(-2)).unwrap();
assert!(pos == 3 && 3 == reader.position_in_bits().unwrap());
let pos = reader.seek_bits(SeekFrom::End(5)).unwrap();
assert!(pos == 11 && 11 == reader.position_in_bits().unwrap());
Sourcepub fn position_in_bits(&mut self) -> Result<u64>
pub fn position_in_bits(&mut self) -> Result<u64>
§Example
use std::fs::read;
use std::io::{Read, Cursor, SeekFrom};
use bitstream_io::{BigEndian, BitReader, BitRead};
let data = [0x00, 0xFF];
let mut reader = BitReader::endian(Cursor::new(&data), BigEndian);
assert_eq!(reader.position_in_bits().unwrap(), 0);
let _: i32 = reader.read_signed::<5, _>().unwrap();
assert_eq!(reader.position_in_bits().unwrap(), 5);
reader.read_bit().unwrap();
assert_eq!(reader.position_in_bits().unwrap(), 6);
Trait Implementations§
Source§impl<R: Read, E: Endianness> BitRead for BitReader<R, E>
impl<R: Read, E: Endianness> BitRead for BitReader<R, E>
Source§fn skip(&mut self, bits: u32) -> Result<()>
fn skip(&mut self, bits: u32) -> Result<()>
§Examples
use std::io::Read;
use bitstream_io::{BigEndian, BitReader, BitRead};
let data = [0b10110111];
let mut reader = BitReader::endian(data.as_slice(), BigEndian);
assert!(reader.skip(3).is_ok());
assert_eq!(reader.read::<5, u8>().unwrap(), 0b10111);
use std::io::Read;
use bitstream_io::{LittleEndian, BitReader, BitRead};
let data = [0b10110111];
let mut reader = BitReader::endian(data.as_slice(), LittleEndian);
assert!(reader.skip(3).is_ok());
assert_eq!(reader.read::<5, u8>().unwrap(), 0b10110);
Source§fn read_bytes(&mut self, buf: &mut [u8]) -> Result<()>
fn read_bytes(&mut self, buf: &mut [u8]) -> Result<()>
§Example
use std::io::Read;
use bitstream_io::{BigEndian, BitReader, BitRead};
let data = b"foobar";
let mut reader = BitReader::endian(data.as_slice(), BigEndian);
assert!(reader.skip(24).is_ok());
let mut buf = [0;3];
assert!(reader.read_bytes(&mut buf).is_ok());
assert_eq!(&buf, b"bar");
Source§fn read_unsigned_counted<const BITS: u32, U>(
&mut self,
bits: BitCount<BITS>,
) -> Result<U>where
U: UnsignedInteger,
fn read_unsigned_counted<const BITS: u32, U>(
&mut self,
bits: BitCount<BITS>,
) -> Result<U>where
U: UnsignedInteger,
Source§fn read_unsigned<const BITS: u32, U>(&mut self) -> Result<U>where
U: UnsignedInteger,
fn read_unsigned<const BITS: u32, U>(&mut self) -> Result<U>where
U: UnsignedInteger,
Source§fn read_signed_counted<const MAX: u32, S>(
&mut self,
bits: impl TryInto<SignedBitCount<MAX>>,
) -> Result<S>where
S: SignedInteger,
fn read_signed_counted<const MAX: u32, S>(
&mut self,
bits: impl TryInto<SignedBitCount<MAX>>,
) -> Result<S>where
S: SignedInteger,
Source§fn read_signed<const BITS: u32, S>(&mut self) -> Result<S>where
S: SignedInteger,
fn read_signed<const BITS: u32, S>(&mut self) -> Result<S>where
S: SignedInteger,
Source§fn read_to<V>(&mut self) -> Result<V>where
V: Primitive,
fn read_to<V>(&mut self) -> Result<V>where
V: Primitive,
Source§fn read_as_to<F, V>(&mut self) -> Result<V>where
F: Endianness,
V: Primitive,
fn read_as_to<F, V>(&mut self) -> Result<V>where
F: Endianness,
V: Primitive,
Source§fn read_unary<const STOP_BIT: u8>(&mut self) -> Result<u32>
fn read_unary<const STOP_BIT: u8>(&mut self) -> Result<u32>
STOP_BIT
and returns the amount read.
STOP_BIT
must be 0 or 1.
Because this field is variably-sized and may be large,
its output is always a u32
type. Read moreSource§fn byte_aligned(&self) -> bool
fn byte_aligned(&self) -> bool
Source§fn byte_align(&mut self)
fn byte_align(&mut self)
Source§fn read<const BITS: u32, I>(&mut self) -> Result<I>where
I: Integer,
fn read<const BITS: u32, I>(&mut self) -> Result<I>where
I: Integer,
Source§fn read_var<I>(&mut self, bits: u32) -> Result<I>
fn read_var<I>(&mut self, bits: u32) -> Result<I>
Source§fn read_count<const MAX: u32>(&mut self) -> Result<BitCount<MAX>>
fn read_count<const MAX: u32>(&mut self) -> Result<BitCount<MAX>>
Source§fn read_counted<const MAX: u32, I>(&mut self, bits: BitCount<MAX>) -> Result<I>
fn read_counted<const MAX: u32, I>(&mut self, bits: BitCount<MAX>) -> Result<I>
Source§fn read_unsigned_var<U>(&mut self, bits: u32) -> Result<U>where
U: UnsignedInteger,
fn read_unsigned_var<U>(&mut self, bits: u32) -> Result<U>where
U: UnsignedInteger,
Source§fn read_signed_var<S>(&mut self, bits: u32) -> Result<S>where
S: SignedInteger,
fn read_signed_var<S>(&mut self, bits: u32) -> Result<S>where
S: SignedInteger,
Source§fn read_const<const BITS: u32, const VALUE: u32, E>(
&mut self,
err: E,
) -> Result<(), E>
fn read_const<const BITS: u32, const VALUE: u32, E>( &mut self, err: E, ) -> Result<(), E>
Source§fn read_to_bytes<const SIZE: usize>(&mut self) -> Result<[u8; SIZE]>
fn read_to_bytes<const SIZE: usize>(&mut self) -> Result<[u8; SIZE]>
read_exact
call. Otherwise it will read
bytes individually in 8-bit increments. Read moreSource§fn read_to_vec(&mut self, bytes: usize) -> Result<Vec<u8>>
fn read_to_vec(&mut self, bytes: usize) -> Result<Vec<u8>>
read_exact
call. Otherwise it will read
bytes individually in 8-bit increments. Read moreSource§fn parse_with<'a, F: FromBitStreamWith<'a>>(
&mut self,
context: &F::Context,
) -> Result<F, F::Error>
fn parse_with<'a, F: FromBitStreamWith<'a>>( &mut self, context: &F::Context, ) -> Result<F, F::Error>
Auto Trait Implementations§
impl<R, E> Freeze for BitReader<R, E>where
R: Freeze,
impl<R, E> RefUnwindSafe for BitReader<R, E>where
R: RefUnwindSafe,
E: RefUnwindSafe,
impl<R, E> Send for BitReader<R, E>
impl<R, E> Sync for BitReader<R, E>
impl<R, E> Unpin for BitReader<R, E>
impl<R, E> UnwindSafe for BitReader<R, E>where
R: UnwindSafe,
E: UnwindSafe,
Blanket Implementations§
Source§impl<R> BitRead2 for Rwhere
R: BitRead,
impl<R> BitRead2 for Rwhere
R: BitRead,
Source§fn read<I>(&mut self, bits: u32) -> Result<I, Error>where
I: Integer,
fn read<I>(&mut self, bits: u32) -> Result<I, Error>where
I: Integer,
Source§fn read_in<const BITS: u32, I>(&mut self) -> Result<I, Error>where
I: Integer,
fn read_in<const BITS: u32, I>(&mut self) -> Result<I, Error>where
I: Integer,
Source§fn read_signed<S>(&mut self, bits: u32) -> Result<S, Error>where
S: SignedInteger,
fn read_signed<S>(&mut self, bits: u32) -> Result<S, Error>where
S: SignedInteger,
Source§fn read_signed_in<const BITS: u32, S>(&mut self) -> Result<S, Error>where
S: SignedInteger,
fn read_signed_in<const BITS: u32, S>(&mut self) -> Result<S, Error>where
S: SignedInteger,
Source§fn read_to<V>(&mut self) -> Result<V, Error>where
V: Primitive,
fn read_to<V>(&mut self) -> Result<V, Error>where
V: Primitive,
Source§fn read_as_to<F, V>(&mut self) -> Result<V, Error>where
F: Endianness,
V: Primitive,
fn read_as_to<F, V>(&mut self) -> Result<V, Error>where
F: Endianness,
V: Primitive,
Source§fn skip(&mut self, bits: u32) -> Result<(), Error>
fn skip(&mut self, bits: u32) -> Result<(), Error>
seek
method. Read moreSource§fn read_bytes(&mut self, buf: &mut [u8]) -> Result<(), Error>
fn read_bytes(&mut self, buf: &mut [u8]) -> Result<(), Error>
read_exact
call. Otherwise it will read
bytes individually in 8-bit increments. Read moreSource§fn read_unary0(&mut self) -> Result<u32, Error>
fn read_unary0(&mut self) -> Result<u32, Error>
u32
type. Read moreSource§fn read_unary1(&mut self) -> Result<u32, Error>
fn read_unary1(&mut self) -> Result<u32, Error>
u32
type. Read moreSource§fn byte_aligned(&self) -> bool
fn byte_aligned(&self) -> bool
Source§fn byte_align(&mut self)
fn byte_align(&mut self)
Source§fn read_to_bytes<const SIZE: usize>(&mut self) -> Result<[u8; SIZE]>
fn read_to_bytes<const SIZE: usize>(&mut self) -> Result<[u8; SIZE]>
read_exact
call. Otherwise it will read
bytes individually in 8-bit increments. Read moreSource§fn read_to_vec(&mut self, bytes: usize) -> Result<Vec<u8>>
fn read_to_vec(&mut self, bytes: usize) -> Result<Vec<u8>>
read_exact
call. Otherwise it will read
bytes individually in 8-bit increments. Read more