Skip to main content

psdk_fruit_emapi/
endian.rs

1use crate::error::{EmapiError, Result};
2
3pub fn read_uint16(data: &[u8], offset: usize) -> Result<u16> {
4  check_range(data, offset, 2)?;
5  Ok(u16::from_le_bytes([data[offset], data[offset + 1]]))
6}
7
8pub fn read_int16(data: &[u8], offset: usize) -> Result<i16> {
9  Ok(read_uint16(data, offset)? as i16)
10}
11
12pub fn read_uint32(data: &[u8], offset: usize) -> Result<u32> {
13  check_range(data, offset, 4)?;
14  Ok(u32::from_le_bytes([
15    data[offset],
16    data[offset + 1],
17    data[offset + 2],
18    data[offset + 3],
19  ]))
20}
21
22pub fn uint16(value: u16) -> [u8; 2] {
23  value.to_le_bytes()
24}
25
26pub fn uint32(value: u32) -> [u8; 4] {
27  value.to_le_bytes()
28}
29
30pub fn write_uint16(data: &mut [u8], offset: usize, value: u16) -> Result<()> {
31  check_range(data, offset, 2)?;
32  data[offset..offset + 2].copy_from_slice(&uint16(value));
33  Ok(())
34}
35
36pub fn write_uint32(data: &mut [u8], offset: usize, value: u32) -> Result<()> {
37  check_range(data, offset, 4)?;
38  data[offset..offset + 4].copy_from_slice(&uint32(value));
39  Ok(())
40}
41
42fn check_range(data: &[u8], offset: usize, length: usize) -> Result<()> {
43  if offset
44    .checked_add(length)
45    .is_none_or(|end| end > data.len())
46  {
47    return Err(EmapiError::NotEnoughData {
48      offset,
49      length,
50      data_len: data.len(),
51    });
52  }
53  Ok(())
54}