Module bitstream_io::read
source · Expand description
Traits and implementations for reading bits from a stream.
Example
Reading the initial STREAMINFO block from a FLAC file, as documented in its specification.
use std::io::{Cursor, Read};
use bitstream_io::{BigEndian, BitReader};
let flac: Vec<u8> = vec![0x66,0x4C,0x61,0x43,0x00,0x00,0x00,0x22,
0x10,0x00,0x10,0x00,0x00,0x06,0x06,0x00,
0x21,0x62,0x0A,0xC4,0x42,0xF0,0x00,0x04,
0xA6,0xCC,0xFA,0xF2,0x69,0x2F,0xFD,0xEC,
0x2D,0x5B,0x30,0x01,0x76,0xB4,0x62,0x88,
0x7D,0x92];
let mut cursor = Cursor::new(&flac);
{
let mut reader = BitReader::endian(&mut cursor, BigEndian);
// stream marker
let mut file_header: [u8; 4] = [0, 0, 0, 0];
reader.read_bytes(&mut file_header).unwrap();
assert_eq!(&file_header, b"fLaC");
// metadata block header
let last_block: bool = reader.read_bit().unwrap();
let block_type: u8 = reader.read(7).unwrap();
let block_size: u32 = reader.read(24).unwrap();
assert_eq!(last_block, false);
assert_eq!(block_type, 0);
assert_eq!(block_size, 34);
// STREAMINFO block
let minimum_block_size: u16 = reader.read(16).unwrap();
let maximum_block_size: u16 = reader.read(16).unwrap();
let minimum_frame_size: u32 = reader.read(24).unwrap();
let maximum_frame_size: u32 = reader.read(24).unwrap();
let sample_rate: u32 = reader.read(20).unwrap();
let channels = reader.read::<u8>(3).unwrap() + 1;
let bits_per_sample = reader.read::<u8>(5).unwrap() + 1;
let total_samples: u64 = reader.read(36).unwrap();
assert_eq!(minimum_block_size, 4096);
assert_eq!(maximum_block_size, 4096);
assert_eq!(minimum_frame_size, 1542);
assert_eq!(maximum_frame_size, 8546);
assert_eq!(sample_rate, 44100);
assert_eq!(channels, 2);
assert_eq!(bits_per_sample, 16);
assert_eq!(total_samples, 304844);
}
// STREAMINFO's MD5 sum
// Note that the wrapped reader can be used once bitstream reading
// is finished at exactly the position one would expect.
let mut md5 = [0; 16];
cursor.read_exact(&mut md5).unwrap();
assert_eq!(&md5,
b"\xFA\xF2\x69\x2F\xFD\xEC\x2D\x5B\x30\x01\x76\xB4\x62\x88\x7D\x92");
Structs
For reading non-aligned bits from a stream of bytes in a given endianness.