#[cfg(test)]
mod tests;
const BYTEMASK_32: u32 = 0b11111111;
const BYTEMASK_16: u16 = 0b11111111;
pub fn two_byte_extraction(buffer: &[u8], idx: usize) -> u16
{
    two_byte_combine(buffer[idx], buffer[idx + 1])
}
pub fn two_byte_combine(item_1: u8, item_2: u8) -> u16
{
    ((item_1 as u16) << 8) | (item_2 as u16)
}
pub fn two_byte_split(num: u16) -> (u8, u8)
{
    ((num >> 8) as u8,
     (num & BYTEMASK_16) as u8)
}
pub fn four_byte_split(num: u32) -> (u8, u8, u8, u8)
{
    ((num >> 24) as u8,
     ((num >> 16) & BYTEMASK_32) as u8,
     ((num >> 8) & BYTEMASK_32) as u8,
     (num & BYTEMASK_32) as u8)
}
pub fn four_byte_combine(item_1: u8, item_2: u8, item_3: u8, item_4: u8) -> u32
{
    ((item_1 as u32) << 24) |
     ((item_2 as u32) << 16) |
     ((item_3 as u32) << 8) |
     item_4 as u32
}
pub fn apply_split_bytes(buffer: &mut [u8], value: u16, index: usize)
{
    let val = two_byte_split(value);
    buffer[index] = val.0;
    buffer[index + 1] = val.1;
}
pub fn push_split_bytes(buffer: &mut Vec<u8>, value: u16)
{
    let val = two_byte_split(value);
    buffer.push(val.0);
    buffer.push(val.1);
}