[−][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. |