1
2extern crate byteorder;
5
6use byteorder::{ByteOrder, BigEndian};
7use std::{io::{Read, Write, Result}, convert::TryInto};
8
9pub struct DataBuffer {
11 data: Vec<u8>,
12 wpos: usize,
13 rpos: usize,
14 rbit: usize,
15 wbit: usize,
16 header: PacketHeader
17}
18
19pub enum PacketHeader {
20 NORMAL,
21 SHORT,
22 BYTE
23}
24
25impl DataBuffer {
26 pub fn new() -> DataBuffer {
28 DataBuffer {
29 data: vec![],
30 wpos: 0,
31 rpos: 0,
32 rbit: 0,
33 wbit: 0,
34 header: PacketHeader::NORMAL
35 }
36 }
37
38 pub fn from_bytes(bytes: &[u8]) -> DataBuffer {
44 let mut buffer = DataBuffer::new();
45 buffer.write_bytes(bytes);
46 buffer
47 }
48
49 pub fn with_vec(bytes: Vec<u8>) -> DataBuffer {
54 DataBuffer { data: bytes, wpos: 0, rpos: 0, rbit: 0, wbit: 0, header: PacketHeader::NORMAL }
55 }
56
57 pub fn create(opcode: u8, header: PacketHeader) -> DataBuffer {
58 let mut buff = DataBuffer::new();
59 buff.write_u8(opcode);
60
61 match header {
62 PacketHeader::NORMAL => {},
63 PacketHeader::BYTE => {
64 buff.write_u8(255);
65 }
66 PacketHeader::SHORT => {
67 buff.write_u16(65535);
68 }
69 }
70
71 buff.header = header;
72
73 buff
74 }
75
76 pub fn finish(&mut self){
77 let mut size = self.get_wpos();
78
79 self.set_wpos(1);
80 self.set_rpos(1);
81
82 let header_bytes = match self.header {
83 PacketHeader::NORMAL => 0,
84 PacketHeader::BYTE => 1,
85 PacketHeader::SHORT => 2
86 };
87
88 size = ((size as u8) - header_bytes - 1).try_into().unwrap();
89
90 match self.header {
91 PacketHeader::NORMAL => {},
92 PacketHeader::BYTE => {
93 self.write_u8(size.try_into().unwrap());
94 }
95 PacketHeader::SHORT => {
96 self.write_u16(size.try_into().unwrap());
97 }
98 }
99
100 self.set_rpos(0);
101 }
102
103 pub fn len(&self) -> usize {
105 self.data.len()
106 }
107
108 pub fn clear(&mut self) {
110 self.data.clear();
111 self.wpos = 0;
112 self.rpos = 0;
113 }
114
115 pub fn resize(&mut self, size: usize) {
119 let diff = size - self.data.len();
120 if diff > 0 {
121 self.data.extend(std::iter::repeat(0).take(diff))
122 }
123 }
124
125 pub fn write_bytes(&mut self, bytes: &[u8]) {
137 self.flush_bit();
138
139 let size = bytes.len() + self.wpos;
140
141 if size > self.data.len() {
142 self.resize(size);
143 }
144
145 for v in bytes {
146 self.data[self.wpos] = *v;
147 self.wpos += 1;
148 }
149 }
150
151 pub fn write_u8(&mut self, val: u8) {
161 self.write_bytes(&[val]);
162 }
163
164 pub fn write_i8(&mut self, val: i8) {
166 self.write_u8(val as u8);
167 }
168
169 pub fn write_u16(&mut self, val: u16) {
179 let mut buf = [0; 2];
180 BigEndian::write_u16(&mut buf, val);
181 self.write_bytes(&buf);
182 }
183
184 pub fn write_i16(&mut self, val: i16) {
186 self.write_u16(val as u16);
187 }
188
189 pub fn write_u32(&mut self, val: u32) {
199 let mut buf = [0; 4];
200 BigEndian::write_u32(&mut buf, val);
201 self.write_bytes(&buf);
202 }
203
204 pub fn write_i32(&mut self, val: i32) {
206 self.write_u32(val as u32);
207 }
208
209 pub fn write_u64(&mut self, val: u64) {
219 let mut buf = [0; 8];
220 BigEndian::write_u64(&mut buf, val);
221 self.write_bytes(&buf);
222 }
223
224 pub fn write_i64(&mut self, val: i64) {
226 self.write_u64(val as u64);
227 }
228
229 pub fn write_f32(&mut self, val: f32) {
239 let mut buf = [0; 4];
240 BigEndian::write_f32(&mut buf, val);
241 self.write_bytes(&buf);
242 }
243
244 pub fn write_f64(&mut self, val: f64) {
254 let mut buf = [0; 8];
255 BigEndian::write_f64(&mut buf, val);
256 self.write_bytes(&buf);
257 }
258
259 pub fn write_str(&mut self, val: &str) {
271 self.write_u32(val.len() as u32);
272 self.write_bytes(val.as_bytes());
273 }
274
275 pub fn write_ntstr(&mut self, val: &str) {
285 self.write_bytes(val.as_bytes());
286 self.write_u8(0);
287 }
288
289 pub fn write_dntstr(&mut self, val: &str){
298 self.write_u8(0);
299 self.write_bytes(val.as_bytes());
300 self.write_u8(0);
301 }
302
303 pub fn write_smart(&mut self, val: u16){
305 if val > 128 {
306 self.write_u16(val.wrapping_add(32768));
307 } else {
308 self.write_u8(val as u8);
309 }
310 }
311
312 pub fn write_medium(&mut self, val: u32) {
314 self.write_i8((val >> 16) as i8);
315 self.write_i8(((val >> 8) & 0xFF) as i8);
316 self.write_i8((val & 0xFF) as i8);
317 }
318
319 pub fn write_u8_neg(&mut self, val: u8) {
321 self.write_i8(-(val as i8));
322 }
323
324 pub fn write_i8_neg(&mut self, val: i8) {
326 self.write_i8(val.wrapping_neg());
327 }
328
329 pub fn write_u8_add(&mut self, val: u8) {
331 self.write_u8(val.wrapping_add(128));
332 }
333
334 pub fn write_i8_add(&mut self, val: i8) {
336 self.write_i8(val.wrapping_add(127).wrapping_add(1));
337 }
338
339 pub fn write_u8_sub(&mut self, val: u8) {
341 self.write_i8(val.wrapping_sub(128) as i8);
342 }
343
344 pub fn write_i8_sub(&mut self, val: i8) {
346 self.write_i8(val.wrapping_sub(127).wrapping_sub(1));
347 }
348
349 pub fn write_u16_le(&mut self, val: u16) {
351 self.write_u8(val as u8);
352 self.write_u8((val >> 8) as u8);
353 }
354
355 pub fn write_i16_le(&mut self, val: i16) {
357 self.write_i8(val as i8);
358 self.write_i8((val >> 8) as i8);
359 }
360
361 pub fn write_u16_le_add(&mut self, val: u16) {
363 self.write_u8(val.wrapping_add(128) as u8);
364 self.write_u8((val >> 8) as u8);
365 }
366
367 pub fn write_i16_le_add(&mut self, val: i16) {
369 self.write_i8_add(val as i8);
370 self.write_i8((val >> 8) as i8);
371 }
372
373 pub fn write_u32_le(&mut self, val: u32){
375 self.write_u8(val as u8);
376 self.write_u8((val >> 8) as u8);
377 self.write_u8((val >> 16) as u8);
378 self.write_u8((val >> 24) as u8);
379 }
380
381 pub fn write_i32_le(&mut self, val: i32){
383 self.write_i8(val as i8);
384 self.write_i8((val >> 8) as i8);
385 self.write_i8((val >> 16) as i8);
386 self.write_i8((val >> 24) as i8);
387 }
388
389 pub fn write_u32_me(&mut self, val: u32){
391 self.write_u8((val >> 16) as u8);
392 self.write_u8((val >> 24) as u8);
393 self.write_u8(val as u8);
394 self.write_u8((val >> 8) as u8);
395 }
396
397 pub fn write_u32_me_reversed(&mut self, val: u32){
399 self.write_u8((val >> 8) as u8);
400 self.write_u8(val as u8);
401 self.write_u8((val >> 24) as u8);
402 self.write_u8((val >> 16) as u8);
403 }
404
405 pub fn read_bytes(&mut self, size: usize) -> Vec<u8> {
409 self.flush_bit();
410 assert!(self.rpos + size <= self.data.len());
411 let range = self.rpos..self.rpos + size;
412 let mut res = Vec::<u8>::new();
413 res.write(&self.data[range]).unwrap();
414 self.rpos += size;
415 res
416 }
417
418 pub fn read_u8(&mut self) -> u8 {
428 self.flush_bit();
429 assert!(self.rpos < self.data.len());
430 let pos = self.rpos;
431 self.rpos += 1;
432 self.data[pos]
433 }
434
435 pub fn read_i8(&mut self) -> i8 {
437 self.read_u8() as i8
438 }
439
440 pub fn read_u16(&mut self) -> u16 {
450 self.flush_bit();
451 assert!(self.rpos + 2 <= self.data.len());
452 let range = self.rpos..self.rpos + 2;
453 self.rpos += 2;
454 BigEndian::read_u16(&self.data[range])
455 }
456
457 pub fn read_i16(&mut self) -> i16 {
459 self.read_u16() as i16
460 }
461
462 pub fn read_u32(&mut self) -> u32 {
472 self.flush_bit();
473 assert!(self.rpos + 4 <= self.data.len());
474 let range = self.rpos..self.rpos + 4;
475 self.rpos += 4;
476 BigEndian::read_u32(&self.data[range])
477 }
478
479 pub fn read_i32(&mut self) -> i32 {
481 self.read_u32() as i32
482 }
483
484 pub fn read_u64(&mut self) -> u64 {
494 self.flush_bit();
495 assert!(self.rpos + 8 <= self.data.len());
496 let range = self.rpos..self.rpos + 8;
497 self.rpos += 8;
498 BigEndian::read_u64(&self.data[range])
499 }
500
501 pub fn read_i64(&mut self) -> i64 {
503 self.read_u64() as i64
504 }
505
506 pub fn read_f32(&mut self) -> f32 {
508 self.flush_bit();
509 assert!(self.rpos + 4 <= self.data.len());
510 let range = self.rpos..self.rpos + 4;
511 self.rpos += 4;
512 BigEndian::read_f32(&self.data[range])
513 }
514
515 pub fn read_f64(&mut self) -> f64 {
517 self.flush_bit();
518 assert!(self.rpos + 8 <= self.data.len());
519 let range = self.rpos..self.rpos + 8;
520 self.rpos += 8;
521 BigEndian::read_f64(&self.data[range])
522 }
523
524 pub fn read_string(&mut self) -> String {
528 let size = self.read_u32();
529 String::from_utf8(self.read_bytes(size as usize)).unwrap()
530 }
531
532 pub fn read_ntstr(&mut self) -> String {
534 let mut string = String::new();
535
536 let mut current = self.read_u8();
537 while current != 0 {
538 string.push(current as char);
539 current = self.read_u8();
540 }
541
542 string
543 }
544
545 pub fn read_dntstr(&mut self) -> String {
547 let mut string = String::new();
548
549 assert_eq!(0, self.read_u8());
550
551 let mut current = self.read_u8();
552 while current != 0 {
553 string.push(current as char);
554 current = self.read_u8();
555 }
556
557 string
558 }
559
560 pub fn read_smart(&mut self) -> u16 {
562 if self.data[self.rpos] >= 128 {
563 return self.read_u16().wrapping_sub(32768);
564 }
565 else {
566 return self.read_u8() as u16;
567 }
568 }
569
570 pub fn read_medium(&mut self) -> u32 {
572 return ((self.read_u8() as u32) << 16) + ((self.read_u8() as u32) << 8) + (self.read_u8() as u32);
573 }
574
575 pub fn read_u8_neg(&mut self) -> u8 {
577 return -self.read_i8() as u8;
578 }
579
580 pub fn read_i8_neg(&mut self) -> i8 {
582 return self.read_i8().wrapping_neg();
583 }
584
585 pub fn read_u8_add(&mut self) -> u8 {
587 return self.read_u8().wrapping_sub(128);
588 }
589
590 pub fn read_i8_add(&mut self) -> i8 {
592 return self.read_u8().wrapping_sub(128) as i8;
593 }
594
595 pub fn read_u8_sub(&mut self) -> u8 {
597 return self.read_u8().wrapping_add(128) as u8;
598 }
599
600 pub fn read_i8_sub(&mut self) -> i8 {
602 return self.read_i8().wrapping_add(127).wrapping_add(1) as i8;
603 }
604
605 pub fn read_u16_le(&mut self) -> u16 {
607 let mut bytes: [u8; 2] = [0; 2];
608 let _ = self.read(&mut bytes);
609 return u16::from_le_bytes(bytes);
610 }
611
612 pub fn read_i16_le(&mut self) -> i16 {
614 let mut bytes: [u8; 2] = [0; 2];
615 let _ = self.read(&mut bytes);
616 return i16::from_le_bytes(bytes);
617 }
618
619 pub fn read_u16_le_add(&mut self) -> u16 {
621 let mut bytes: [u8; 2] = [0; 2];
622 let _ = self.read(&mut bytes);
623 bytes[0] = bytes[0].wrapping_sub(128);
624 return u16::from_le_bytes(bytes);
625 }
626
627 pub fn read_i16_le_add(&mut self) -> i16 {
629 let mut bytes: [u8; 2] = [0; 2];
630 let _ = self.read(&mut bytes);
631 bytes[0] = bytes[0].wrapping_sub(128);
632 return i16::from_le_bytes(bytes);
633 }
634
635 pub fn read_u32_le(&mut self) -> u32 {
637 let mut bytes: [u8; 4] = [0; 4];
638 let _ = self.read(&mut bytes);
639 return u32::from_le_bytes(bytes);
640 }
641
642 pub fn read_i32_le(&mut self) -> i32 {
644 let mut bytes: [u8; 4] = [0; 4];
645 let _ = self.read(&mut bytes);
646 return i32::from_le_bytes(bytes);
647 }
648
649 pub fn read_u32_me(&mut self) -> u32 {
651 return ((self.read_u8() as u32) << 16) + ((self.read_u8() as u32) << 24) + ((self.read_u8() as u32)) + ((self.read_u8() as u32) << 8);
652 }
653
654 pub fn read_u32_me_reversed(&mut self) -> u32 {
656 return ((self.read_u8() as u32) << 8) + (self.read_u8() as u32) + ((self.read_u8() as u32) << 24) + ((self.read_u8() as u32) << 16);
657 }
658
659 pub fn to_string(&self) -> String {
663 let mut str = String::new();
664 for b in &self.data {
665 str = str + &format!("0x{:01$x} ", b, 2);
666 }
667 str.pop();
668 str
669 }
670
671 pub fn get_rpos(&self) -> usize {
673 self.rpos
674 }
675
676 pub fn set_rpos(&mut self, rpos: usize) {
679 self.rpos = std::cmp::min(rpos, self.data.len());
680 }
681
682 pub fn get_wpos(&self) -> usize {
684 self.wpos
685 }
686
687 pub fn set_wpos(&mut self, wpos: usize) {
690 self.wpos = std::cmp::min(wpos, self.data.len());
691 }
692
693 pub fn to_bytes(&self) -> Vec<u8> {
697 self.data.to_vec()
698 }
699
700 pub fn deconstruct(self) -> Vec<u8> {
701 self.data
702 }
703
704 pub fn read_bit(&mut self) -> bool {
719 assert!(self.rpos <= self.data.len());
720 let bit = self.data[self.rpos] & (1 << 7 - self.rbit) != 0;
721 self.rbit += 1;
722 if self.rbit > 7 {
723 self.rbit = 0;
724 self.rpos += 1;
725 }
726 bit
727 }
728
729 pub fn read_bits(&mut self, n: u8) -> u64 {
743 if n > 0 {
745 ((if self.read_bit() { 1 } else { 0 }) << n - 1) | self.read_bits(n - 1)
746 } else {
747 0
748 }
749 }
750
751 pub fn flush_bit(&mut self) {
766 if self.rbit > 0 {
767 self.rpos += 1;
768 self.rbit = 0
769 }
770
771 if self.wbit > 0 {
772 self.wpos += 1;
773 self.wbit = 0
774 }
775 }
776
777 pub fn write_bit(&mut self, bit: bool) {
784 let size = self.wpos + 1;
785 if size > self.data.len() {
786 self.resize(size);
787 }
788
789 if bit {
790 self.data[self.wpos] |= 1 << (7 - self.wbit);
791 }
792
793 self.wbit += 1;
794
795 if self.wbit > 7 {
796 self.wbit = 0;
797 self.wpos += 1;
798 }
799 }
800
801 pub fn write_bits(&mut self, value: u64, n: u8) {
811 if n > 0 {
812 self.write_bit((value >> n - 1) & 1 != 0);
813 self.write_bits(value, n - 1);
814 } else {
815 self.write_bit((value & 1) != 0);
816 }
817 }
818}
819
820impl Read for DataBuffer {
821 fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
822 self.flush_bit();
823 let read_len = std::cmp::min(self.data.len() - self.rpos, buf.len());
824 let range = self.rpos..self.rpos + read_len;
825 for (i, val) in (&self.data[range]).iter().enumerate() {
826 buf[i] = *val;
827 }
828 self.rpos += read_len;
829 Ok(read_len)
830 }
831}
832
833impl Write for DataBuffer {
834 fn write(&mut self, buf: &[u8]) -> Result<usize> {
835 self.write_bytes(buf);
836 Ok(buf.len())
837 }
838
839 fn flush(&mut self) -> Result<()> {
840 Ok(())
841 }
842}
843
844impl std::fmt::Debug for DataBuffer {
845 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
846 let rpos = if self.rbit > 0 {
847 self.rpos + 1
848 } else {
849 self.rpos
850 };
851
852 let read_len = self.data.len() - rpos;
853 let mut remaining_data = vec![0; read_len];
854 let range = rpos..rpos + read_len;
855 for (i, val) in (&self.data[range]).iter().enumerate() {
856 remaining_data[i] = *val;
857 }
858
859 write!(f, "DataBuffer {{ remaining_data: {:?}, total_data: {:?} }}",
860 remaining_data, self.data)
861 }
862}