dnfile 0.2.3

.NET binary extractor
Documentation
use crate::{error::Error, Result};

pub fn read_usize(data: &[u8]) -> Result<usize> {
    match data.len() {
        1 => Ok(data[0] as usize),
        2 => Ok(u16::from_le_bytes(data[..].try_into()?) as usize),
        4 => Ok(u32::from_le_bytes(data[..].try_into()?) as usize),
        8 => Ok(u64::from_le_bytes(data[..].try_into()?) as usize),
        _ => Err(Error::CantReadUsizeFromBytesLen(data.len())),
    }
}

pub fn read_compressed_usize(data: &[u8]) -> Result<(usize, usize)> {
    if data[0] & 0x80 == 0 {
        Ok((data[0] as usize, 1))
    } else if data[0] & 0x40 == 0 {
        let mut value = (data[0] as usize & 0x7F) << 8;
        value |= data[1] as usize;
        Ok((value, 2))
    } else if data[0] & 0x20 == 0 {
        let mut value = (data[0] as usize & 0x3F) << 24;
        value |= (data[1] as usize) << 16;
        value |= (data[2] as usize) << 8;
        value |= data[3] as usize;
        Ok((value, 4))
    } else {
        Err(Error::ReadCompressedUsize)
    }
}