1use crate::Endian;
2use byteorder::{BigEndian, ByteOrder, LittleEndian};
3use std::{
4 fmt::Debug,
5 io::{Error, ErrorKind, Read, Result, Write},
6};
7
8pub struct ByteBufferAdv {
11 data: Vec<u8>,
12 wpos: usize,
13 rpos: usize,
14 wbit: usize,
15 rbit: usize,
16 endian: Endian,
17}
18
19impl From<&[u8]> for ByteBufferAdv {
20 fn from(value: &[u8]) -> Self {
21 ByteBufferAdv::from_bytes(value)
22 }
23}
24
25impl From<Vec<u8>> for ByteBufferAdv {
26 fn from(value: Vec<u8>) -> Self {
27 ByteBufferAdv::from_vec(value)
28 }
29}
30
31impl From<ByteBufferAdv> for Vec<u8> {
32 fn from(value: ByteBufferAdv) -> Self {
33 value.into_vec()
34 }
35}
36
37impl Default for ByteBufferAdv {
38 fn default() -> Self {
39 Self::new()
40 }
41}
42
43impl Read for ByteBufferAdv {
44 fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
45 self.flush_bits();
46 let read_len = std::cmp::min(self.data.len() - self.rpos, buf.len());
47 let range = self.rpos..self.rpos + read_len;
48 for (i, val) in self.data[range].iter().enumerate() {
49 buf[i] = *val;
50 }
51 self.rpos += read_len;
52 Ok(read_len)
53 }
54}
55
56impl Write for ByteBufferAdv {
57 fn write(&mut self, buf: &[u8]) -> Result<usize> {
58 self.write_bytes(buf);
59 Ok(buf.len())
60 }
61
62 fn flush(&mut self) -> Result<()> {
63 Ok(())
64 }
65}
66
67impl Debug for ByteBufferAdv {
68 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
69 let rpos = if self.rbit > 0 {
70 self.rpos + 1
71 } else {
72 self.rpos
73 };
74
75 let read_len = self.data.len() - rpos;
76 let mut remaining_data = vec![0; read_len];
77 let range = rpos..rpos + read_len;
78 for (i, val) in self.data[range].iter().enumerate() {
79 remaining_data[i] = *val;
80 }
81
82 write!(
83 f,
84 "ByteBuffer {{ remaining_data: {:?}, total_data: {:?}, wpos: {:?}, rpos: {:?}, endian: {:?} }}",
85 remaining_data, self.data, self.wpos, self.rpos, self.endian
86 )
87 }
88}
89
90impl ByteBufferAdv {
91 pub fn new() -> ByteBufferAdv {
93 ByteBufferAdv {
94 data: vec![],
95 wpos: 0,
96 rpos: 0,
97 wbit: 0,
98 rbit: 0,
99 endian: Endian::BigEndian,
100 }
101 }
102
103 pub fn from_bytes(bytes: &[u8]) -> ByteBufferAdv {
105 let mut buf = ByteBufferAdv::new();
106 buf.write_bytes(bytes);
107 buf
108 }
109
110 pub fn from_vec(vec: Vec<u8>) -> ByteBufferAdv {
113 let len = vec.len();
114 ByteBufferAdv {
115 data: vec,
116 wpos: len,
117 rpos: 0,
118 wbit: 0,
119 rbit: 0,
120 endian: Endian::BigEndian,
121 }
122 }
123
124 pub fn into_vec(self) -> Vec<u8> {
126 self.data
127 }
128
129 pub fn len(&self) -> usize {
131 self.data.len()
132 }
133
134 pub fn is_empty(&self) -> bool {
136 self.data.is_empty()
137 }
138
139 pub fn clear(&mut self) {
141 self.data.clear();
142 self.reset_cursors();
143 self.reset_bits_cursors();
144 }
145
146 pub fn reset_cursors(&mut self) {
148 self.wpos = 0;
149 self.rpos = 0;
150 }
151
152 pub fn reset_bits_cursors(&mut self) {
154 self.wbit = 0;
155 self.rbit = 0;
156 }
157
158 pub fn resize(&mut self, size: usize) {
162 let diff = size - self.data.len();
163 if diff > 0 {
164 self.data.extend(std::iter::repeat(0).take(diff));
165 }
166 }
167
168 pub fn set_endian(&mut self, endian: Endian) {
172 self.endian = endian;
173 }
174
175 pub fn endian(&self) -> Endian {
177 self.endian
178 }
179}
180
181impl ByteBufferAdv {
182 pub fn write_bytes(&mut self, bytes: &[u8]) {
187 self.flush_bits();
188
189 let size = bytes.len() + self.wpos;
190
191 if size > self.data.len() {
192 self.resize(size);
193 };
194
195 for b in bytes {
196 self.data[self.wpos] = *b;
197 self.wpos += 1;
198 }
199 }
200
201 pub fn write_u8(&mut self, val: u8) {
204 self.write_bytes(&[val]);
205 }
206
207 pub fn write_u16(&mut self, val: u16) {
208 let mut buf = [0; 2];
209
210 match self.endian {
211 Endian::BigEndian => BigEndian::write_u16(&mut buf, val),
212 Endian::LittleEndian => LittleEndian::write_u16(&mut buf, val),
213 };
214
215 self.write_bytes(&buf);
216 }
217
218 pub fn write_u32(&mut self, val: u32) {
219 let mut buf = [0; 4];
220
221 match self.endian {
222 Endian::BigEndian => BigEndian::write_u32(&mut buf, val),
223 Endian::LittleEndian => LittleEndian::write_u32(&mut buf, val),
224 };
225
226 self.write_bytes(&buf);
227 }
228
229 pub fn write_u64(&mut self, val: u64) {
230 let mut buf = [0; 8];
231
232 match self.endian {
233 Endian::BigEndian => BigEndian::write_u64(&mut buf, val),
234 Endian::LittleEndian => LittleEndian::write_u64(&mut buf, val),
235 };
236
237 self.write_bytes(&buf);
238 }
239
240 pub fn write_u128(&mut self, val: u128) {
241 let mut buf = [0; 16];
242
243 match self.endian {
244 Endian::BigEndian => BigEndian::write_u128(&mut buf, val),
245 Endian::LittleEndian => LittleEndian::write_u128(&mut buf, val),
246 };
247
248 self.write_bytes(&buf);
249 }
250
251 pub fn write_i8(&mut self, val: i8) {
254 self.write_u8(val as u8);
255 }
256
257 pub fn write_i16(&mut self, val: i16) {
258 self.write_u16(val as u16);
259 }
260
261 pub fn write_i32(&mut self, val: i32) {
262 self.write_u32(val as u32);
263 }
264
265 pub fn write_i64(&mut self, val: i64) {
266 self.write_u64(val as u64);
267 }
268
269 pub fn write_i128(&mut self, val: i128) {
270 self.write_u128(val as u128);
271 }
272
273 pub fn write_f32(&mut self, val: f32) {
276 let mut buf = [0; 4];
277
278 match self.endian {
279 Endian::BigEndian => BigEndian::write_f32(&mut buf, val),
280 Endian::LittleEndian => LittleEndian::write_f32(&mut buf, val),
281 };
282
283 self.write_bytes(&buf);
284 }
285
286 pub fn write_f64(&mut self, val: f64) {
287 let mut buf = [0; 8];
288
289 match self.endian {
290 Endian::BigEndian => BigEndian::write_f64(&mut buf, val),
291 Endian::LittleEndian => LittleEndian::write_f64(&mut buf, val),
292 };
293
294 self.write_bytes(&buf);
295 }
296
297 pub fn write_string(&mut self, val: &str) {
300 self.write_u32(val.len() as u32);
301 self.write_bytes(val.as_bytes());
302 }
303}
304
305impl ByteBufferAdv {
306 pub fn read_bytes(&mut self, size: usize) -> Result<Vec<u8>> {
309 self.flush_bits();
310 if self.rpos + size > self.data.len() {
311 return Err(Error::new(
312 ErrorKind::UnexpectedEof,
313 "Could not read enough bytes from buffer"
314 ))
315 }
316 let range = self.rpos..self.rpos+size;
317 let mut res = Vec::<u8>::new();
318 res.write_all(&self.data[range])?;
319 self.rpos += size;
320 Ok(res)
321 }
322}
323
324impl ByteBufferAdv {
325 pub fn flush_bits(&mut self) {
327 if self.rbit > 0 {
328 self.flush_rbits();
329 }
330 if self.wbit > 0 {
331 self.flush_wbits();
332 }
333 }
334
335 fn flush_rbits(&mut self) {
336 self.rpos += 1;
337 self.rbit = 0
338 }
339
340 fn flush_wbits(&mut self) {
341 self.wpos += 1;
342 self.wbit = 0
343 }
344}