Scheme
#![allow(unused)] fn main() { pub struct Scheme(...); }
Defines a pattern giving meaning to different regions of a bit string.
Implementation
#![allow(unused)] fn main() { pub fn new<I: IntoIterator<Item = Field>>(pattern: I) -> Self }Creates a new scheme from the sequence of fields.
#![allow(unused)] fn main() { let unsigned_3 = Field::unsigned(3); let scheme = Scheme::new([ Field::signed(5), Field::BIT, unsigned_3, unsigned_3, Field::UNSIGNED_4, Field::aligned(23, 1, true), Field::unsigned(32), Field::signed(32), Field::bytes(4, false), Field::aligned(6, 8, true) ]); let time_since_epoch = Field::UNSIGNED_64; let identifier = Field::UNSIGNED_8; let datatype = Field::UNSIGNED_4; let data = Field::BYTES; let scheme2 = Scheme::new([time_since_epoch, identifier, datatype, data]); }
#![allow(unused)] fn main() { pub fn len(&self) -> isize }Number of bits extracted
If any field in the scheme has a negative length, this method returns -1, indicating the scheme extracts a variable number of bits.
#![allow(unused)] fn main() { let unsigned_3 = Field::unsigned(3); let scheme = Scheme::new([ Field::signed(5), Field::BIT, unsigned_3, unsigned_3, Field::UNSIGNED_4 ]); assert_eq!(scheme.len(), 16); let scheme2 = Scheme::new([ Field::aligned(23, 1, true), Field::unsigned(0), Field::unsigned(32), Field::bytes(4, false), Field::aligned(0, 8, false), Field::aligned(7, 8, true) ]); let scheme3 = Scheme::new([ Field::aligned(23, 1, true), Field::unsigned(0), Field::unsigned(32), Field::signed(-1), Field::bytes(4, false), Field::aligned(0, 8, false), Field::aligned(7, 8, true) ]); assert_eq!(scheme3.len(), -1); }#![allow(unused)] fn main() { pub fn split_bits(&self, bits: &Bits) -> Vec<Bits> }Extracts the data associated with the fields of this scheme
#![allow(unused)] fn main() { let unsigned_3 = Field::unsigned(3); let scheme = Scheme::new([ Field::signed(5), Field::BIT, unsigned_3, unsigned_3, Field::UNSIGNED_4 ]); let bits = Bits::new([0xBA, 0x1C]); let parts = scheme.split_bits(&bits); assert_eq!(bits_as::int8(&parts[0]), -6); assert_eq!(bits_as::uint8(&parts[1]), 1); assert_eq!(bits_as::uint8(&parts[2]), 2); assert_eq!(bits_as::uint8(&parts[3]), 6); assert_eq!(bits_as::uint8(&parts[4]), 1); let bits2 = Bits::new([0xBA]); let parts2 = scheme.split_bits(&bits2); assert_eq!(bits_as::int8(&parts2[0]), -6); assert_eq!(bits_as::uint8(&parts2[1]), 1); assert_eq!(bits_as::uint8(&parts2[2]), 2); assert_eq!(bits_as::uint8(&parts2[3]), 0); assert_eq!(bits_as::uint8(&parts2[4]), 0); let scheme2 = Scheme::new([ Field::aligned(23, -1, true), Field::aligned(0, -1, false), Field::bytes(-1, false), Field::signed(-1), Field::unsigned(-1), Field::unsigned(0), Field::unsigned(32), Field::bytes(4, false), Field::aligned(0, 8, false), Field::aligned(7, 8, true), Field::signed(-1), Field::unsigned(-1) ]); let bytes = [0xBA, 0xDC, 0xFE, 0x10, 0x32]; let bits3 = Bits::from(bytes.as_slice()); // 38-bits let parts = scheme2.split_bits(&bits3); assert_eq!(bits_as::int32(&parts[0]), 0xFFFEDCBAu32 as i32); assert_eq!(parts[1], Bits::empty()); assert_eq!(bits_as::vec_u8(&parts[2]), vec![0x21]); assert_eq!(bits_as::vec_i32(&parts[3]), vec![-28]); assert_eq!(parts[4], Bits::empty()); assert_eq!(parts[5], Bits::empty()); assert_eq!(parts[6], Bits::zeros(32)); assert_eq!(parts[7], Bits::zeros(32)); assert_eq!(parts[8], Bits::empty()); assert_eq!(parts[9], Bits::zeros(56)); assert_eq!(parts[10], Bits::empty()); assert_eq!(parts[11], Bits::empty()); }
#![allow(unused)] fn main() { pub fn split_bits_at(&self, index: usize, bits: &Bits) -> Vec<Bits> }Extracts the data associated with the fields of this scheme.
#![allow(unused)] fn main() { let unsigned_3 = Field::unsigned(3); let scheme = Scheme::new([ Field::signed(5), Field::BIT, unsigned_3, unsigned_3, Field::UNSIGNED_4 ]); let bits = Bits::new([0xBA, 0x1C]); let parts = scheme.split_bits_at(0, &bits); assert_eq!(bits_as::int8(&parts[0]), -6); assert_eq!(bits_as::uint8(&parts[1]), 1); assert_eq!(bits_as::uint8(&parts[2]), 2); assert_eq!(bits_as::uint8(&parts[3]), 6); assert_eq!(bits_as::uint8(&parts[4]), 1); let parts2 = scheme.split_bits_at(8, &bits); assert_eq!(bits_as::int8(&parts2[0]), -4); assert_eq!(bits_as::uint8(&parts2[1]), 0); assert_eq!(bits_as::uint8(&parts2[2]), 0); assert_eq!(bits_as::uint8(&parts2[3]), 0); assert_eq!(bits_as::uint8(&parts2[4]), 0); let scheme2 = Scheme::new([ Field::aligned(23, -1, true), Field::aligned(0, -1, false), Field::bytes(-1, false), Field::signed(-1), Field::unsigned(-1), Field::unsigned(0), Field::unsigned(32), Field::bytes(4, false), Field::aligned(0, 8, false), Field::aligned(7, 8, true), Field::signed(-1), Field::unsigned(-1) ]); let bytes = [0xBA, 0xDC, 0xFE, 0x10, 0x32]; let bits3 = Bits::from(bytes.as_slice()); // 38-bits let parts = scheme2.split_bits_at(4, &bits3); assert_eq!(bits_as::int32(&parts[0]), 0x0FEDCB); assert_eq!(parts[1], Bits::empty()); assert_eq!(bits_as::vec_u8(&parts[2]), vec![0x42]); assert_eq!(bits_as::vec_i32(&parts[3]), vec![-2]); assert_eq!(parts[4], Bits::empty()); assert_eq!(parts[5], Bits::empty()); assert_eq!(parts[6], Bits::zeros(32)); assert_eq!(parts[7], Bits::zeros(32)); assert_eq!(parts[8], Bits::empty()); assert_eq!(parts[9], Bits::zeros(56)); assert_eq!(parts[10], Bits::empty()); assert_eq!(parts[11], Bits::empty());f }
#![allow(unused)] fn main() { pub fn split_bytes<I: IntoIterator<Item = u8>>(&self, bytes: I) -> Vec<Bits> }Extracts the data associated with the fields of this scheme
#![allow(unused)] fn main() { let unsigned_3 = Field::unsigned(3); let scheme = Scheme::new([ Field::signed(5), Field::BIT, unsigned_3, unsigned_3, Field::UNSIGNED_4 ]); let parts = scheme.split_bytes([0xBA, 0x1C]); assert_eq!(bits_as::int8(&parts[0]), -6); assert_eq!(bits_as::uint8(&parts[1]), 1); assert_eq!(bits_as::uint8(&parts[2]), 2); assert_eq!(bits_as::uint8(&parts[3]), 6); assert_eq!(bits_as::uint8(&parts[4]), 1); let parts2 = scheme.split_bytes([0xBA]); assert_eq!(bits_as::int8(&parts2[0]), -6); assert_eq!(bits_as::uint8(&parts2[1]), 1); assert_eq!(bits_as::uint8(&parts2[2]), 2); assert_eq!(bits_as::uint8(&parts2[3]), 0); assert_eq!(bits_as::uint8(&parts2[4]), 0); let scheme2 = Scheme::new([ Field::aligned(23, -1, true), Field::aligned(0, -1, false), Field::bytes(-1, false), Field::signed(-1), Field::unsigned(-1), Field::unsigned(0), Field::unsigned(32), Field::bytes(4, false), Field::aligned(0, 8, false), Field::aligned(7, 8, true), Field::signed(-1), Field::unsigned(-1) ]); let parts = scheme2.split_bytes(vec![0xBA, 0xDC, 0xFE, 0x10, 0x32]); assert_eq!(bits_as::int32(&parts[0]), 0xFFFEDCBAu32 as i32); assert_eq!(parts[1], Bits::empty()); assert_eq!(bits_as::vec_u8(&parts[2]), vec![0x21, 0x64]); assert_eq!(parts[3], Bits::zeros(1)); assert_eq!(bits_as::int64(&parts[4]), 0); assert_eq!(parts[5], Bits::empty()); assert_eq!(parts[6], Bits::zeros(32)); assert_eq!(parts[7], Bits::zeros(32)); assert_eq!(parts[8], Bits::empty()); assert_eq!(parts[9], Bits::zeros(56)); assert_eq!(parts[10], Bits::empty()); assert_eq!(parts[11], Bits::empty()); }
#![allow(unused)] fn main() { pub fn split_bytes_at<I: IntoIterator<Item = u8>>( &self, index: usize, bytes: I, ) -> Vec<Bits> }Extracts the data associated with the fields of this scheme.
#![allow(unused)] fn main() { let unsigned_3 = Field::unsigned(3); let scheme = Scheme::new([ Field::signed(5), Field::BIT, unsigned_3, unsigned_3, Field::UNSIGNED_4 ]); let parts = scheme.split_bytes_at(0, [0xBA, 0x1C]); assert_eq!(bits_as::int8(&parts[0]), -6); assert_eq!(bits_as::uint8(&parts[1]), 1); assert_eq!(bits_as::uint8(&parts[2]), 2); assert_eq!(bits_as::uint8(&parts[3]), 6); assert_eq!(bits_as::uint8(&parts[4]), 1); let parts2 = scheme.split_bytes_at(8, [0xBA, 0x1C]); assert_eq!(bits_as::int8(&parts2[0]), -4); assert_eq!(bits_as::uint8(&parts2[1]), 0); assert_eq!(bits_as::uint8(&parts2[2]), 0); assert_eq!(bits_as::uint8(&parts2[3]), 0); assert_eq!(bits_as::uint8(&parts2[4]), 0); let scheme2 = Scheme::new([ Field::aligned(23, -1, true), Field::aligned(0, -1, false), Field::bytes(-1, false), Field::signed(-1), Field::unsigned(-1), Field::unsigned(0), Field::unsigned(32), Field::bytes(4, false), Field::aligned(0, 8, false), Field::aligned(7, 8, true), Field::signed(-1), Field::unsigned(-1) ]); let parts = scheme2.split_bytes_at(4, [0xBA, 0xDC, 0xFE, 0x10, 0x32]); assert_eq!(bits_as::int32(&parts[0]), 0x0FEDCB); assert_eq!(parts[1], Bits::empty()); assert_eq!(bits_as::vec_u8(&parts[2]), vec![0x42]); assert_eq!(bits_as::vec_i32(&parts[3]), vec![6]); assert_eq!(parts[4], Bits::empty()); assert_eq!(parts[5], Bits::empty()); assert_eq!(parts[6], Bits::zeros(32)); assert_eq!(parts[7], Bits::zeros(32)); assert_eq!(parts[8], Bits::empty()); assert_eq!(parts[9], Bits::zeros(56)); assert_eq!(parts[10], Bits::empty()); assert_eq!(parts[11], Bits::empty()); }