bytebuffer_new/
lib.rs

1extern crate byteorder;
2
3use byteorder::{ByteOrder, BigEndian, LittleEndian};
4use std::io::{Read, Write, Result};
5
6/// An enum to represent the byte order of the ByteBuffer object
7#[derive(Debug, Clone, Copy)]
8pub enum Endian{
9    BigEndian,
10    LittleEndian,
11}
12
13/// A byte buffer object specifically turned to easily read and write binary values
14pub struct ByteBuffer {
15    data: Vec<u8>,
16    wpos: usize,
17    rpos: usize,
18    rbit: usize,
19    wbit: usize,
20    endian: Endian,
21}
22
23impl ByteBuffer {
24    /// Construct a new, empty, ByteBuffer
25    pub fn new() -> ByteBuffer {
26        ByteBuffer {
27            data: vec![],
28            wpos: 0,
29            rpos: 0,
30            rbit: 0,
31            wbit: 0,
32            endian: Endian::BigEndian,       
33        }
34    }
35
36    /// Construct a new ByteBuffer filled with the data array.
37    pub fn from_bytes(bytes: &[u8]) -> ByteBuffer {
38        let mut buffer = ByteBuffer::new();
39        buffer.write_bytes(bytes);
40        buffer
41    }
42
43    /// Return the buffer size
44    pub fn len(&self) -> usize {
45        self.data.len()
46    }
47
48    /// Clear the buffer and reinitialize the reading and writing cursor
49    pub fn clear(&mut self) {
50        self.data.clear();
51        self.wpos = 0;
52        self.rpos = 0;
53    }
54
55    /// Change the buffer size to size.
56    ///
57    /// _Note_: You cannot shrink a buffer with this method
58    pub fn resize(&mut self, size: usize) {
59        let diff = size - self.data.len();
60        if diff > 0 {
61            self.data.extend(std::iter::repeat(0).take(diff))
62        }
63    }
64
65    /// Set the byte order of the buffer
66    ///
67    /// _Note_: By default the buffer uses big endian order
68    pub fn set_endian(&mut self, endian: Endian) {
69        self.endian = endian;
70    }
71
72    /// Returns the current byte order of the buffer
73    pub fn endian(&self) -> Endian {
74        self.endian
75    }
76
77    // Write operations
78
79    /// Append a byte array to the buffer. The buffer is automatically extended if needed
80    ///
81    /// #Example
82    ///
83    /// ```
84    /// # use bytebuffer::*;
85    /// let mut buffer = ByteBuffer::new();
86    /// buffer.write_bytes(&vec![0x1, 0xFF, 0x45]); // buffer contains [0x1, 0xFF, 0x45]
87    /// ```
88    pub fn write_bytes(&mut self, bytes: &[u8]) {
89        self.flush_bit();
90
91        let size = bytes.len() + self.wpos;
92
93        if size > self.data.len() {
94            self.resize(size);
95        }
96
97        for v in bytes {
98            self.data[self.wpos] = *v;
99            self.wpos += 1;
100        }
101    }
102
103    /// Append a byte (8 bits value) to the buffer
104    ///
105    /// #Example
106    ///
107    /// ```
108    /// #  use bytebuffer::*;
109    /// let mut buffer = ByteBuffer::new();
110    /// buffer.write_u8(1) // buffer contains [0x1]
111    /// ```
112    pub fn write_u8(&mut self, val: u8) {
113        self.write_bytes(&[val]);
114    }
115
116    /// Same as `write_u8()` but for signed values
117    pub fn write_i8(&mut self, val: i8) {
118        self.write_u8(val as u8);
119    }
120
121    /// Append a word (16 bits value) to the buffer
122    ///
123    /// #Example
124    ///
125    /// ```
126    /// #  use bytebuffer::*;
127    /// let mut buffer = ByteBuffer::new();
128    /// buffer.write_u16(1) // buffer contains [0x00, 0x1] if little endian
129    /// ```
130    pub fn write_u16(&mut self, val: u16) {
131        let mut buf = [0; 2];
132        
133        match self.endian{
134            Endian::BigEndian => BigEndian::write_u16(&mut buf, val),
135            Endian::LittleEndian => LittleEndian::write_u16(&mut buf, val),
136        };
137
138        self.write_bytes(&buf);
139    }
140
141    /// Same as `write_u16()` but for signed values
142    pub fn write_i16(&mut self, val: i16) {
143        self.write_u16(val as u16);
144    }
145
146    /// Append a double word (32 bits value) to the buffer
147    ///
148    /// #Example
149    ///
150    /// ```
151    /// #  use bytebuffer::*;
152    /// let mut buffer = ByteBuffer::new();
153    /// buffer.write_u32(1) // buffer contains [0x00, 0x00, 0x00, 0x1] if little endian
154    /// ```
155    pub fn write_u32(&mut self, val: u32) {
156        let mut buf = [0; 4];
157        
158        match self.endian{
159            Endian::BigEndian => BigEndian::write_u32(&mut buf, val),
160            Endian::LittleEndian => LittleEndian::write_u32(&mut buf, val),
161        };
162
163        self.write_bytes(&buf);
164    }
165
166    /// Same as `write_u32()` but for signed values
167    pub fn write_i32(&mut self, val: i32) {
168        self.write_u32(val as u32);
169    }
170
171    /// Append a quaddruple word (64 bits value) to the buffer
172    ///
173    /// #Example
174    ///
175    /// ```
176    /// #  use bytebuffer::*;
177    /// let mut buffer = ByteBuffer::new();
178    /// buffer.write_u64(1) // buffer contains [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1] if little endian
179    /// ```
180    pub fn write_u64(&mut self, val: u64) {
181        let mut buf = [0; 8];
182        match self.endian{
183            Endian::BigEndian => BigEndian::write_u64(&mut buf, val),
184            Endian::LittleEndian => LittleEndian::write_u64(&mut buf, val),
185        };
186
187        self.write_bytes(&buf);
188    }
189
190    /// Same as `write_u64()` but for signed values
191    pub fn write_i64(&mut self, val: i64) {
192        self.write_u64(val as u64);
193    }
194
195    /// Append a 32 bits floating point number to the buffer.
196    ///
197    /// #Example
198    ///
199    /// ```
200    /// #  use bytebuffer::*;
201    /// let mut buffer = ByteBuffer::new();
202    /// buffer.write_f32(0.1)
203    /// ```
204    pub fn write_f32(&mut self, val: f32) {
205        let mut buf = [0; 4];
206        
207        match self.endian{
208            Endian::BigEndian => BigEndian::write_f32(&mut buf, val),
209            Endian::LittleEndian => LittleEndian::write_f32(&mut buf, val),
210        };
211
212        self.write_bytes(&buf);
213    }
214
215    /// Append a 64 bits floating point number to the buffer.
216    ///
217    /// #Example
218    ///
219    /// ```
220    /// #  use bytebuffer::*;
221    /// let mut buffer = ByteBuffer::new();
222    /// buffer.write_f64(0.1)
223    /// ```
224    pub fn write_f64(&mut self, val: f64) {
225        let mut buf = [0; 8];
226
227        match self.endian{
228            Endian::BigEndian => BigEndian::write_f64(&mut buf, val),
229            Endian::LittleEndian => LittleEndian::write_f64(&mut buf, val),
230        };
231        self.write_bytes(&buf);
232    }
233
234    /// Append a string to the buffer.
235    ///
236    /// *Format* The format is `(u32)size + size * (u8)characters`
237    ///
238    /// #Exapmle
239    ///
240    /// ```
241    /// #  use bytebuffer::*;
242    /// let mut buffer = ByteBuffer::new();
243    /// buffer.write_string("Hello")
244    /// ```
245    pub fn write_string(&mut self, val: &str) {
246        self.write_u32(val.len() as u32);
247        self.write_bytes(val.as_bytes());
248    }
249
250    // Read operations
251
252    /// Read a defined amount of raw bytes. The program crash if not enough bytes are available
253    pub fn read_bytes(&mut self, size: usize) -> Vec<u8> {
254        self.flush_bit();
255        assert!(self.rpos + size <= self.data.len());
256        let range = self.rpos..self.rpos + size;
257        let mut res = Vec::<u8>::new();
258        res.write(&self.data[range]).unwrap();
259        self.rpos += size;
260        res
261    }
262
263    /// Read one byte. The program crash if not enough bytes are available
264    ///
265    /// #Example
266    ///
267    /// ```
268    /// #  use bytebuffer::*;
269    /// let mut buffer = ByteBuffer::from_bytes(&vec![0x1]);
270    /// let value = buffer.read_u8(); //Value contains 1
271    /// ```
272    pub fn read_u8(&mut self) -> u8 {
273        self.flush_bit();
274        assert!(self.rpos < self.data.len());
275        let pos = self.rpos;
276        self.rpos += 1;
277        self.data[pos]
278    }
279
280    /// Same as `read_u8()` but for signed values
281    pub fn read_i8(&mut self) -> i8 {
282        self.read_u8() as i8
283    }
284
285    /// Read a 2-bytes long value. The program crash if not enough bytes are available
286    ///
287    /// #Example
288    ///
289    /// ```
290    /// #  use bytebuffer::*;
291    /// let mut buffer = ByteBuffer::from_bytes(&vec![0x0, 0x1]);
292    /// let value = buffer.read_u16(); //Value contains 1
293    /// ```
294    pub fn read_u16(&mut self) -> u16 {
295        self.flush_bit();
296        assert!(self.rpos + 2 <= self.data.len());
297        let range = self.rpos..self.rpos + 2;
298        self.rpos += 2;
299
300        match self.endian{
301            Endian::BigEndian => BigEndian::read_u16(&self.data[range]),
302            Endian::LittleEndian => LittleEndian::read_u16(&self.data[range]),
303        }
304    }
305
306    /// Same as `read_u16()` but for signed values
307    pub fn read_i16(&mut self) -> i16 {
308        self.read_u16() as i16
309    }
310
311    /// Read a four-bytes long value. The program crash if not enough bytes are available
312    ///
313    /// #Example
314    ///
315    /// ```
316    /// #  use bytebuffer::*;
317    /// let mut buffer = ByteBuffer::from_bytes(&vec![0x0, 0x0, 0x0, 0x1]);
318    /// let value = buffer.read_u32(); // Value contains 1
319    /// ```
320    pub fn read_u32(&mut self) -> u32 {
321        self.flush_bit();
322        assert!(self.rpos + 4 <= self.data.len());
323        let range = self.rpos..self.rpos + 4;
324        self.rpos += 4;
325
326        match self.endian{
327            Endian::BigEndian => BigEndian::read_u32(&self.data[range]),
328            Endian::LittleEndian => LittleEndian::read_u32(&self.data[range]),
329        }
330    }
331
332    /// Same as `read_u32()` but for signed values
333    pub fn read_i32(&mut self) -> i32 {
334        self.read_u32() as i32
335    }
336
337    /// Read an eight bytes long value. The program crash if not enough bytes are available
338    ///
339    /// #Example
340    ///
341    /// ```
342    /// #  use bytebuffer::*;
343    /// let mut buffer = ByteBuffer::from_bytes(&vec![0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1]);
344    /// let value = buffer.read_u64(); //Value contains 1
345    /// ```
346    pub fn read_u64(&mut self) -> u64 {
347        self.flush_bit();
348        assert!(self.rpos + 8 <= self.data.len());
349        let range = self.rpos..self.rpos + 8;
350        self.rpos += 8;
351
352        match self.endian{
353            Endian::BigEndian => BigEndian::read_u64(&self.data[range]),
354            Endian::LittleEndian => LittleEndian::read_u64(&self.data[range]),
355        }
356
357    }
358
359    /// Same as `read_u64()` but for signed values
360    pub fn read_i64(&mut self) -> i64 {
361        self.read_u64() as i64
362    }
363
364    /// Read a 32 bits floating point value. The program crash if not enough bytes are available
365    pub fn read_f32(&mut self) -> f32 {
366        self.flush_bit();
367        assert!(self.rpos + 4 <= self.data.len());
368        let range = self.rpos..self.rpos + 4;
369        self.rpos += 4;
370
371        match self.endian{
372            Endian::BigEndian => BigEndian::read_f32(&self.data[range]),
373            Endian::LittleEndian => LittleEndian::read_f32(&self.data[range]),
374        }
375    }
376
377    /// Read a 64 bits floating point value. The program crash if not enough bytes are available
378    pub fn read_f64(&mut self) -> f64 {
379        self.flush_bit();
380        assert!(self.rpos + 8 <= self.data.len());
381        let range = self.rpos..self.rpos + 8;
382        self.rpos += 8;
383
384        match self.endian{
385            Endian::BigEndian => BigEndian::read_f64(&self.data[range]),
386            Endian::LittleEndian => LittleEndian::read_f64(&self.data[range]),
387        }
388    }
389
390    /// Read a string.
391    ///
392    /// *Note* : First it reads a 32 bits value representing the size, the read 'size' raw bytes.
393    pub fn read_string(&mut self) -> String {
394        let size = self.read_u32();
395        String::from_utf8(self.read_bytes(size as usize)).unwrap()
396    }
397
398    // Other
399
400    /// Dump the byte buffer to a string.
401    pub fn to_string(&self) -> String {
402        let mut str = String::new();
403        for b in &self.data {
404            str = str + &format!("0x{:01$x} ", b, 2);
405        }
406        str.pop();
407        str
408    }
409
410    /// Return the position of the reading cursor
411    pub fn get_rpos(&self) -> usize {
412        self.rpos
413    }
414
415    /// Set the reading cursor position.
416    /// *Note* : Set the reading cursor to `min(newPosition, self.len())` to prevent overflow
417    pub fn set_rpos(&mut self, rpos: usize) {
418        self.rpos = std::cmp::min(rpos, self.data.len());
419    }
420
421    /// Return the writing cursor position
422    pub fn get_wpos(&self) -> usize {
423        self.wpos
424    }
425
426    /// Set the writing cursor position.
427    /// *Note* : Set the writing cursor to `min(newPosition, self.len())` to prevent overflow
428    pub fn set_wpos(&mut self, wpos: usize) {
429        self.wpos = std::cmp::min(wpos, self.data.len());
430    }
431
432    /// Return the raw byte buffer.
433    pub fn to_bytes(&self) -> Vec<u8> {
434        self.data.to_vec()
435    }
436
437    //Bit manipulation functions
438
439    /// Read 1 bit. Return true if the bit is set to 1, otherwhise, return false.
440    ///
441    /// **Note** Bits are read from left to right
442    ///
443    /// #Example
444    ///
445    /// ```
446    /// #  use bytebuffer::*;
447    /// let mut buffer = ByteBuffer::from_bytes(&vec![128]); // 10000000b
448    /// let value1 = buffer.read_bit(); //value1 contains true (eg: bit is 1)
449    /// let value2 = buffer.read_bit(); //value2 contains false (eg: bit is 0)
450    /// ```
451    pub fn read_bit(&mut self) -> bool {
452        assert!(self.rpos <= self.data.len());
453        let bit = self.data[self.rpos] & (1 << 7 - self.rbit) != 0;
454        self.rbit += 1;
455        if self.rbit > 7 {
456            self.rbit = 0;
457            self.rpos += 1;
458        }
459        bit
460    }
461
462    /// Read n bits. an return the corresponding value an u64.
463    ///
464    /// **Note 1** : We cannot read more than 64 bits
465    ///
466    /// **Note 2** Bits are read from left to right
467    ///
468    /// #Example
469    ///
470    /// ```
471    /// #  use bytebuffer::*;
472    /// let mut buffer = ByteBuffer::from_bytes(&vec![128]); // 10000000b
473    /// let value = buffer.read_bits(3); // value contains 4 (eg: 100b)
474    /// ```
475    pub fn read_bits(&mut self, n: u8) -> u64 {
476        // TODO : Assert that n <= 64
477        if n > 0 {
478            ((if self.read_bit() { 1 } else { 0 }) << n - 1) | self.read_bits(n - 1)
479        } else {
480            0
481        }
482    }
483
484    /// Discard all the pending bits available for reading or writing and place the the corresponding cursor to the next byte.
485    ///
486    /// **Note 1** : If no bits are currently read or written, this function does nothing.
487    /// **Note 2** : This function is automatically called for each write or read operations.
488    /// #Example
489    ///
490    /// ```text
491    /// 10010010 | 00000001
492    /// ^
493    /// 10010010 | 00000001 // read_bit called
494    ///  ^
495    /// 10010010 | 00000001 // flush_bit() called
496    ///            ^
497    /// ```
498    pub fn flush_bit(&mut self) {
499        if self.rbit > 0 {
500            self.rpos += 1;
501            self.rbit = 0
502        }
503
504        if self.wbit > 0 {
505            self.wpos += 1;
506            self.wbit = 0
507        }
508    }
509
510    /// Append 1 bit value to the buffer.
511    /// The bit is happened like this :
512    ///
513    /// ```text
514    /// ...| XXXXXXXX | 10000000 |....
515    /// ```
516    pub fn write_bit(&mut self, bit: bool) {
517        let size = self.wpos + 1;
518        if size > self.data.len() {
519            self.resize(size);
520        }
521
522        if bit {
523            self.data[self.wpos] |= 1 << (7 - self.wbit);
524        }
525
526        self.wbit += 1;
527
528        if self.wbit > 7 {
529            self.wbit = 0;
530            self.wpos += 1;
531        }
532    }
533
534    /// Write the given value as a sequence of n bits
535    ///
536    /// #Example
537    ///
538    /// ```
539    /// #  use bytebuffer::*;
540    /// let mut buffer = ByteBuffer::new();
541    /// buffer.write_bits(4, 3); // append 100b
542    /// ```
543    pub fn write_bits(&mut self, value: u64, n: u8) {
544        if n > 0 {
545            self.write_bit((value >> n - 1) & 1 != 0);
546            self.write_bits(value, n - 1);
547        } else {
548            self.write_bit((value & 1) != 0);
549        }
550    }
551}
552
553impl Read for ByteBuffer {
554    fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
555        self.flush_bit();
556        let read_len = std::cmp::min(self.data.len() - self.rpos, buf.len());
557        let range = self.rpos..self.rpos + read_len;
558        for (i, val) in (&self.data[range]).iter().enumerate() {
559            buf[i] = *val;
560        }
561        self.rpos += read_len;
562        Ok(read_len)
563    }
564}
565
566impl Write for ByteBuffer {
567    fn write(&mut self, buf: &[u8]) -> Result<usize> {
568        self.write_bytes(buf);
569        Ok(buf.len())
570    }
571
572    fn flush(&mut self) -> Result<()> {
573        Ok(())
574    }
575}
576
577impl std::fmt::Debug for ByteBuffer {
578    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
579        let rpos = if self.rbit > 0 {
580            self.rpos + 1
581        } else {
582            self.rpos
583        };
584
585        let read_len = self.data.len() - rpos;
586        let mut remaining_data = vec![0; read_len];
587        let range = rpos..rpos + read_len;
588        for (i, val) in (&self.data[range]).iter().enumerate() {
589            remaining_data[i] = *val;
590        }
591
592        write!(f, "ByteBuffer {{ remaining_data: {:?}, total_data: {:?}, endian: {:?} }}",
593               remaining_data, self.data, self.endian)
594    }
595}