imageinfo 0.7.27

Rust library to get image size and format without loading/decoding.
Documentation
use std::convert::TryInto;
use std::mem::size_of;

pub struct RawBuffer {
    pub data: Vec<u8>,
}

#[allow(dead_code)]
impl RawBuffer {
    pub fn new(length: usize) -> RawBuffer {
        RawBuffer {
            data: vec![0; length],
        }
    }

    pub fn piece(&self, offset: usize, length: usize) -> &[u8] {
        &(self.data[offset..(offset + length)])
    }

    pub fn len(&self) -> usize {
        self.data.len()
    }

    pub fn read_i8(&self, offset: usize) -> i8 {
        i8::from_le_bytes(self.piece(offset, size_of::<i8>()).try_into().unwrap())
    }

    pub fn read_u8(&self, offset: usize) -> u8 {
        u8::from_le_bytes(self.piece(offset, size_of::<u8>()).try_into().unwrap())
    }

    pub fn read_i16_le(&self, offset: usize) -> i16 {
        i16::from_le_bytes(self.piece(offset, size_of::<i16>()).try_into().unwrap())
    }

    pub fn read_i16_be(&self, offset: usize) -> i16 {
        i16::from_be_bytes(self.piece(offset, size_of::<i16>()).try_into().unwrap())
    }

    pub fn read_u16_le(&self, offset: usize) -> u16 {
        u16::from_le_bytes(self.piece(offset, size_of::<u16>()).try_into().unwrap())
    }

    pub fn read_u16_be(&self, offset: usize) -> u16 {
        u16::from_be_bytes(self.piece(offset, size_of::<u16>()).try_into().unwrap())
    }

    pub fn read_i32_le(&self, offset: usize) -> i32 {
        i32::from_le_bytes(self.piece(offset, size_of::<i32>()).try_into().unwrap())
    }

    pub fn read_i32_be(&self, offset: usize) -> i32 {
        i32::from_be_bytes(self.piece(offset, size_of::<i32>()).try_into().unwrap())
    }

    pub fn read_u32_le(&self, offset: usize) -> u32 {
        u32::from_le_bytes(self.piece(offset, size_of::<u32>()).try_into().unwrap())
    }

    pub fn read_u32_be(&self, offset: usize) -> u32 {
        u32::from_be_bytes(self.piece(offset, size_of::<u32>()).try_into().unwrap())
    }

    pub fn read_i64_le(&self, offset: usize) -> i64 {
        i64::from_le_bytes(self.piece(offset, size_of::<i64>()).try_into().unwrap())
    }

    pub fn read_i64_be(&self, offset: usize) -> i64 {
        i64::from_be_bytes(self.piece(offset, size_of::<i64>()).try_into().unwrap())
    }

    pub fn read_u64_le(&self, offset: usize) -> u64 {
        u64::from_le_bytes(self.piece(offset, size_of::<u64>()).try_into().unwrap())
    }

    pub fn read_u64_be(&self, offset: usize) -> u64 {
        u64::from_be_bytes(self.piece(offset, size_of::<u64>()).try_into().unwrap())
    }

    pub fn read_str(&self, offset: usize, length: usize) -> String {
        String::from_utf8_lossy(self.piece(offset, length)).to_string()
    }

    pub fn read_str_all(&self) -> String {
        self.read_str(0, self.len())
    }

    pub fn cmp(&self, offset: usize, length: usize, buf: &[u8]) -> bool {
        self.piece(offset, length) == buf
    }

    pub fn cmp_any_of(&self, offset: usize, length: usize, buf_list: Vec<&[u8]>) -> bool {
        for buf in &buf_list {
            if self.cmp(offset, length, buf) {
                return true;
            }
        }
        false
    }
}