Skip to main content

yks_converter/
byte_buffer.rs

1use byteorder::{BigEndian, WriteBytesExt};
2
3#[derive(Debug, Clone)]
4pub struct ByteBuffer {
5    buf: Vec<u8>,
6    read_pos: usize,
7}
8
9impl ByteBuffer {
10    pub fn new() -> Self {
11        ByteBuffer {
12            buf: Vec::new(),
13            read_pos: 0,
14        }
15    }
16
17
18    pub fn put_byte(&mut self, value: u8) -> &mut Self {
19        self.buf.push(value);
20        self
21    }
22
23    pub fn put_bytes(&mut self, other: &ByteBuffer) -> &mut Self {
24        self.buf.extend(&other.buf);
25        self
26    }
27
28    pub fn put_u16(&mut self, value: u16) -> &mut Self {
29        let mut temp = Vec::new();
30        temp.write_u16::<BigEndian>(value).unwrap();
31        self.buf.extend(temp);
32        self
33    }
34
35    pub fn put_u32(&mut self, value: u32) -> &mut Self {
36        let mut temp = Vec::new();
37        temp.write_u32::<BigEndian>(value).unwrap();
38        self.buf.extend(temp);
39        self
40    }
41
42    pub fn put_string(&mut self, value: &str) -> &mut Self {
43        self.buf.extend(value.bytes());
44        self
45    }
46
47    pub fn put_bytes_array(&mut self, bytes: &[u8]) -> &mut Self {
48        self.buf.extend(bytes);
49        self
50    }
51
52    pub fn get(&mut self) -> u8 {
53        if self.read_pos < self.buf.len() {
54            let value = self.buf[self.read_pos];
55            self.read_pos += 1;
56            value
57        } else {
58            0
59        }
60    }
61
62    pub fn get_at(&self, index: usize) -> u8 {
63        if index < self.buf.len() {
64            self.buf[index]
65        } else {
66            0
67        }
68    }
69
70    pub fn size(&self) -> usize {
71        self.buf.len()
72    }
73
74    pub fn clear(&mut self) {
75        self.buf.clear();
76        self.read_pos = 0;
77    }
78
79    pub fn print_hex(&self) {
80        println!("ByteBuffer Length: {}, Hex: ", self.buf.len());
81        for (i, byte) in self.buf.iter().enumerate() {
82            print!("{:02x} ", byte);
83            if (i + 1) % 16 == 0 {
84                println!();
85            }
86        }
87        println!();
88    }
89
90    pub fn as_slice(&self) -> &[u8] {
91        &self.buf
92    }
93
94    pub fn to_vec(&self) -> Vec<u8> {
95        self.buf.clone()
96    }
97}
98
99
100impl Default for ByteBuffer {
101    fn default() -> Self {
102        Self::new()
103    }
104}