[][src]Module bitstream_io::read

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

BitReader

For reading non-aligned bits from a stream of bytes in a given endianness.

ByteReader

For reading aligned bytes from a stream of bytes in a given endianness.