#![allow(non_snake_case)] use byteorder::{ByteOrder, LittleEndian, NativeEndian, ReadBytesExt}; use std::convert::TryInto; use std::io; #[derive(Clone, Copy, Debug)] pub enum Endian { NativeEndian, LittleEndian, BigEndian, } macro_rules! unpack_num { ($type:ty, $endian:expr, $input:expr) => { match $endian { Endian::LittleEndian => <$type>::from_le_bytes($input.try_into().unwrap()), Endian::BigEndian => <$type>::from_be_bytes($input.try_into().unwrap()), Endian::NativeEndian => <$type>::from_ne_bytes($input.try_into().unwrap()), } }; } pub fn unpack_h(endian: Endian, input: &[u8]) -> i16 { unpack_num!(i16, endian, input) } pub fn unpack_H(endian: Endian, input: &[u8]) -> u16 { unpack_num!(u16, endian, input) } pub fn unpack_l(endian: Endian, input: &[u8]) -> i32 { unpack_num!(i32, endian, input) } pub fn unpack_L(endian: Endian, input: &[u8]) -> u32 { unpack_num!(u32, endian, input) }