psdk_fruit_emapi/
endian.rs1use 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}