halfbit/
conv.rs

1use crate::num::PrimitiveInt;
2use crate::num::BITS_PER_BYTE;
3
4pub fn int_le_decode<T: PrimitiveInt>(src: &[u8]) -> Option<T> {
5    if src.len() < T::SIZE {
6        None
7    } else {
8        let mut v = T::ZERO;
9        let mut sh = 0_u8;
10        for b in src[..T::SIZE].iter() {
11            v = v | (T::reinterpret_u8(*b) << sh);
12            sh += 8;
13        }
14        Some(v)
15    }
16}
17
18pub fn int_be_decode<T: PrimitiveInt>(src: &[u8]) -> Option<T> {
19    if src.len() < T::SIZE {
20        None
21    } else {
22        let mut v = T::ZERO;
23        for b in src[..T::SIZE].iter() {
24            v = (v << BITS_PER_BYTE) | T::reinterpret_u8(*b);
25        }
26        Some(v)
27    }
28}
29
30#[cfg(test)]
31mod tests {
32    use super::*;
33
34    #[test]
35    fn u16le_on_truncated_buffer() {
36        assert_eq!(int_le_decode::<u16>(b"\x12"), None);
37    }
38
39    #[test]
40    fn u16le_decode() {
41        assert_eq!(int_le_decode::<u16>(b"\x12\x34").unwrap(), 0x3412);
42    }
43
44    #[test]
45    fn u16be_on_truncated_buffer() {
46        assert_eq!(int_be_decode::<u16>(b"\x12"), None);
47    }
48
49    #[test]
50    fn u16be_decode() {
51        assert_eq!(int_be_decode::<u16>(b"\x12\x34").unwrap(), 0x1234);
52    }
53
54}