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}