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}