imageinfo/
raw_buffer.rs

1use std::convert::TryInto;
2use std::mem::size_of;
3
4pub struct RawBuffer {
5    pub data: Vec<u8>,
6}
7
8#[allow(dead_code)]
9impl RawBuffer {
10    pub fn new(length: usize) -> RawBuffer {
11        RawBuffer {
12            data: vec![0; length],
13        }
14    }
15
16    pub fn piece(&self, offset: usize, length: usize) -> &[u8] {
17        &(self.data[offset..(offset + length)])
18    }
19
20    pub fn len(&self) -> usize {
21        self.data.len()
22    }
23
24    pub fn read_i8(&self, offset: usize) -> i8 {
25        i8::from_le_bytes(self.piece(offset, size_of::<i8>()).try_into().unwrap())
26    }
27
28    pub fn read_u8(&self, offset: usize) -> u8 {
29        u8::from_le_bytes(self.piece(offset, size_of::<u8>()).try_into().unwrap())
30    }
31
32    pub fn read_i16_le(&self, offset: usize) -> i16 {
33        i16::from_le_bytes(self.piece(offset, size_of::<i16>()).try_into().unwrap())
34    }
35
36    pub fn read_i16_be(&self, offset: usize) -> i16 {
37        i16::from_be_bytes(self.piece(offset, size_of::<i16>()).try_into().unwrap())
38    }
39
40    pub fn read_u16_le(&self, offset: usize) -> u16 {
41        u16::from_le_bytes(self.piece(offset, size_of::<u16>()).try_into().unwrap())
42    }
43
44    pub fn read_u16_be(&self, offset: usize) -> u16 {
45        u16::from_be_bytes(self.piece(offset, size_of::<u16>()).try_into().unwrap())
46    }
47
48    pub fn read_i32_le(&self, offset: usize) -> i32 {
49        i32::from_le_bytes(self.piece(offset, size_of::<i32>()).try_into().unwrap())
50    }
51
52    pub fn read_i32_be(&self, offset: usize) -> i32 {
53        i32::from_be_bytes(self.piece(offset, size_of::<i32>()).try_into().unwrap())
54    }
55
56    pub fn read_u32_le(&self, offset: usize) -> u32 {
57        u32::from_le_bytes(self.piece(offset, size_of::<u32>()).try_into().unwrap())
58    }
59
60    pub fn read_u32_be(&self, offset: usize) -> u32 {
61        u32::from_be_bytes(self.piece(offset, size_of::<u32>()).try_into().unwrap())
62    }
63
64    pub fn read_i64_le(&self, offset: usize) -> i64 {
65        i64::from_le_bytes(self.piece(offset, size_of::<i64>()).try_into().unwrap())
66    }
67
68    pub fn read_i64_be(&self, offset: usize) -> i64 {
69        i64::from_be_bytes(self.piece(offset, size_of::<i64>()).try_into().unwrap())
70    }
71
72    pub fn read_u64_le(&self, offset: usize) -> u64 {
73        u64::from_le_bytes(self.piece(offset, size_of::<u64>()).try_into().unwrap())
74    }
75
76    pub fn read_u64_be(&self, offset: usize) -> u64 {
77        u64::from_be_bytes(self.piece(offset, size_of::<u64>()).try_into().unwrap())
78    }
79
80    pub fn read_str(&self, offset: usize, length: usize) -> String {
81        String::from_utf8_lossy(self.piece(offset, length)).to_string()
82    }
83
84    pub fn read_str_all(&self) -> String {
85        self.read_str(0, self.len())
86    }
87
88    pub fn cmp(&self, offset: usize, length: usize, buf: &[u8]) -> bool {
89        self.piece(offset, length) == buf
90    }
91
92    pub fn cmp_any_of(&self, offset: usize, length: usize, buf_list: Vec<&[u8]>) -> bool {
93        for buf in &buf_list {
94            if self.cmp(offset, length, buf) {
95                return true;
96            }
97        }
98        false
99    }
100}