px4_ulog/unpack/mod.rs
1use std::io::{Error, ErrorKind, Result};
2use std::iter::*;
3
4/// Convert a array of eight u8 elements into a u64
5/// Assumes little endianness.
6///
7/// # Examples
8/// ```
9/// use px4_ulog::unpack;
10/// let arr: [u8; 8] = [7, 6, 5, 4, 3, 2, 1, 0];
11/// assert_eq!(unpack::as_u64_le(&arr), 283686952306183);
12/// ```
13pub fn as_u64_le(arr: &[u8; 8]) -> u64 {
14 arr.iter()
15 .enumerate()
16 .map(|(i, v)| (v.clone() as u64) << (8 * i))
17 .sum()
18}
19
20/// Convert a array of four u8 elements into a u32
21/// Assumes little endianness.
22///
23/// # Examples
24/// ```
25/// use px4_ulog::unpack;
26/// let arr: [u8; 4] = [2, 1, 0, 0];
27/// assert_eq!(unpack::as_u32_le(&arr), 258);
28/// ```
29pub fn as_u32_le(arr: &[u8; 4]) -> u32 {
30 arr.iter()
31 .enumerate()
32 .map(|(i, v)| (v.clone() as u32) << (8 * i))
33 .sum()
34}
35
36/// Convert a array of four u8 elements into a i32
37/// Assumes little endianness.
38///
39/// # Examples
40/// ```
41/// use px4_ulog::unpack;
42/// let arr: [u8; 4] = [1, 0, 0, 255];
43/// assert_eq!(unpack::as_i32_le(&arr), -16777215);
44/// ```
45pub fn as_i32_le(arr: &[u8; 4]) -> i32 {
46 as_u32_le(arr) as i32
47}
48
49/// Convert a array of two u8 elements into a u16
50/// Assumes little endianness.
51///
52/// # Examples
53/// ```
54/// use px4_ulog::unpack;
55/// let arr: [u8; 2] = [0, 2];
56/// assert_eq!(unpack::as_u16_le(&arr), 512);
57/// ```
58pub fn as_u16_le(arr: &[u8; 2]) -> u16 {
59 arr.iter()
60 .enumerate()
61 .map(|(i, v)| (v.clone() as u16) << (8 * i))
62 .sum()
63}
64
65/// Convert a array of four u8 elements into a f32
66/// Assumes little endianness.
67///
68/// # Examples
69/// ```
70/// use px4_ulog::unpack;
71/// let arr: [u8; 4] = [0xc000, 0, 0, 0];
72/// assert_eq!(unpack::as_f32_le(&arr), 0.0);
73/// ```
74pub fn as_f32_le(arr: &[u8; 4]) -> f32 {
75 unsafe { *(&as_u32_le(arr) as *const u32 as *const f32) }
76}
77
78/// Convert a u8 slice to a string
79///
80/// # Examples
81/// ```
82/// use px4_ulog::unpack;
83/// let arr: [u8; 5] = [72, 101, 108, 108, 111];
84/// assert_eq!(unpack::as_str(&arr).unwrap(), "Hello");
85/// ```
86pub fn as_str(arr: &[u8]) -> Result<&str> {
87 std::str::from_utf8(arr).map_err(|_| Error::new(ErrorKind::Other, "data is not a string"))
88}