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}