#[must_use]
pub(crate) fn le_u16(data: &[u8], off: usize) -> u16 {
let mut b = [0u8; 2];
if let Some(s) = data.get(off..off.wrapping_add(2)) {
b.copy_from_slice(s);
}
u16::from_le_bytes(b)
}
#[must_use]
pub(crate) fn le_u32(data: &[u8], off: usize) -> u32 {
let mut b = [0u8; 4];
if let Some(s) = data.get(off..off.wrapping_add(4)) {
b.copy_from_slice(s);
}
u32::from_le_bytes(b)
}
#[must_use]
pub(crate) fn le_u48(data: &[u8], off: usize) -> u64 {
let mut b = [0u8; 8];
if let Some(s) = data.get(off..off.wrapping_add(6)) {
b[..6].copy_from_slice(s);
}
u64::from_le_bytes(b)
}
#[must_use]
pub(crate) fn ascii_z(data: &[u8], off: usize) -> String {
let mut out = String::new();
let Some(slice) = data.get(off..) else {
return out; };
for &byte in slice {
if byte == 0 {
break;
}
out.push(byte as char);
}
out
}
#[must_use]
pub(crate) fn utf16_z(data: &[u8], off: usize) -> String {
let Some(slice) = data.get(off..) else {
return String::new(); };
let mut units = Vec::new();
let mut i = 0;
while i + 1 < slice.len() {
let unit = u16::from_le_bytes([slice[i], slice[i + 1]]);
if unit == 0 {
break;
}
units.push(unit);
i += 2;
}
String::from_utf16_lossy(&units)
}
#[must_use]
pub(crate) fn guid(data: &[u8], off: usize) -> Option<String> {
let g = data.get(off..off.wrapping_add(16))?;
Some(format!(
"{:02X}{:02X}{:02X}{:02X}-{:02X}{:02X}-{:02X}{:02X}-{:02X}{:02X}-{:02X}{:02X}{:02X}{:02X}{:02X}{:02X}",
g[3], g[2], g[1], g[0], g[5], g[4], g[7], g[6], g[8], g[9], g[10], g[11], g[12], g[13], g[14], g[15],
))
}