packd/packd/src/parser.rs
2020-04-20 18:57:30 +02:00

38 lines
993 B
Rust

#![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)
}