buffer_util/
buffer.rs

1use crate::Endian;
2use byteorder::{BigEndian, ByteOrder, LittleEndian};
3use std::{
4    fmt::Debug,
5    io::{Error, ErrorKind, Read, Result, Write},
6};
7
8// Version 0.1.1: File structure updated, remaking the ByteBuffer crate to be more usable.
9
10pub 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    /// Construct a new, empty ByteBufferAdv
92    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    /// Construct a new ByteBufferAdv filled with the data array
104    pub fn from_bytes(bytes: &[u8]) -> ByteBufferAdv {
105        let mut buf = ByteBufferAdv::new();
106        buf.write_bytes(bytes);
107        buf
108    }
109
110    /// Constructs a new ByteBufferAdv from an existing vector. This
111    /// function takes ownership of the vector
112    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    /// Return raw byte buffer as Vec<u8>
125    pub fn into_vec(self) -> Vec<u8> {
126        self.data
127    }
128
129    /// Return the buffer size
130    pub fn len(&self) -> usize {
131        self.data.len()
132    }
133
134    /// Check if the buffer is empty
135    pub fn is_empty(&self) -> bool {
136        self.data.is_empty()
137    }
138
139    /// Clear the buffer and reinitialize the reading and writing cursors
140    pub fn clear(&mut self) {
141        self.data.clear();
142        self.reset_cursors();
143        self.reset_bits_cursors();
144    }
145
146    /// Reinitialize the read and writing cursor
147    pub fn reset_cursors(&mut self) {
148        self.wpos = 0;
149        self.rpos = 0;
150    }
151
152    /// Reinitialize the bit reading and bit writing cursor
153    pub fn reset_bits_cursors(&mut self) {
154        self.wbit = 0;
155        self.rbit = 0;
156    }
157
158    /// Change the buffer size to size
159    ///
160    /// _Note_: You cannot shrink a buffer with this method
161    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    /// Set the byte order of the buffer
169    ///
170    /// _Note_: By default, the buffer uses big endian order
171    pub fn set_endian(&mut self, endian: Endian) {
172        self.endian = endian;
173    }
174
175    /// Returns the current byte order of the buffer
176    pub fn endian(&self) -> Endian {
177        self.endian
178    }
179}
180
181impl ByteBufferAdv {
182    // Writing Operations
183
184    // Integer
185
186    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    // Unsigned
202
203    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    // Signed
252
253    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    // Float
274
275    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    // Extra
298
299    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    // Reading Operations
307
308    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    // Flushing Operations
326    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}