pub(crate) fn le_u16(b: &[u8], off: usize) -> u16 {
let mut a = [0u8; 2];
if let Some(s) = b.get(off..off.saturating_add(2)) {
a.copy_from_slice(s);
}
u16::from_le_bytes(a)
}
pub(crate) fn le_u32(b: &[u8], off: usize) -> u32 {
let mut a = [0u8; 4];
if let Some(s) = b.get(off..off.saturating_add(4)) {
a.copy_from_slice(s);
}
u32::from_le_bytes(a)
}
pub(crate) fn le_u64(b: &[u8], off: usize) -> u64 {
let mut a = [0u8; 8];
if let Some(s) = b.get(off..off.saturating_add(8)) {
a.copy_from_slice(s);
}
u64::from_le_bytes(a)
}
pub(crate) fn read_guid(b: &[u8], off: usize) -> [u8; 16] {
let mut g = [0u8; 16];
if let Some(s) = b.get(off..off.saturating_add(16)) {
g.copy_from_slice(s);
}
g
}
pub(crate) fn slice_owned(b: &[u8], off: usize, len: usize) -> Vec<u8> {
let end = off.saturating_add(len).min(b.len());
b.get(off..end).map(<[u8]>::to_vec).unwrap_or_default()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn readers_yield_zero_out_of_range() {
let b = [1u8, 2, 3];
assert_eq!(le_u16(&b, 0), 0x0201);
assert_eq!(le_u16(&b, 10), 0);
assert_eq!(le_u32(&b, 0), 0); assert_eq!(le_u64(&b, 0), 0);
assert_eq!(read_guid(&b, 0), [0u8; 16]);
}
#[test]
fn le_u32_and_u64_in_range() {
let b = [1u8, 0, 0, 0, 0, 0, 0, 0];
assert_eq!(le_u32(&b, 0), 1);
assert_eq!(le_u64(&b, 0), 1);
}
#[test]
fn read_guid_in_range() {
let mut b = [0u8; 16];
b[0] = 0xAA;
assert_eq!(read_guid(&b, 0)[0], 0xAA);
}
#[test]
fn slice_owned_truncates() {
let b = [1u8, 2, 3, 4];
assert_eq!(slice_owned(&b, 1, 2), vec![2, 3]);
assert_eq!(slice_owned(&b, 2, 100), vec![3, 4]);
assert!(slice_owned(&b, 100, 4).is_empty());
}
}