1trait HasByteConvert {
2 fn to_le_bytes(bytes: &mut Vec<u8>, data: Self, offset: usize) -> u8;
3 fn to_be_bytes(bytes: &mut Vec<u8>, data: Self, offset: usize) -> u8;
4}
5
6impl HasByteConvert for u8 {
7 fn to_le_bytes(bytes: &mut Vec<u8>, data: u8, offset: usize) -> u8 {
8 bytes[offset] = data;
9 return 1;
10 }
11 fn to_be_bytes(bytes: &mut Vec<u8>, data: u8, offset: usize) -> u8 {
12 bytes[offset] = data;
13 return 1;
14 }
15}
16
17impl HasByteConvert for u16 {
18 fn to_le_bytes(bytes: &mut Vec<u8>, data: u16, offset: usize) -> u8 {
19 let u8_arr = data.to_le_bytes();
20 bytes[offset] = u8_arr[0];
21 bytes[offset+1] = u8_arr[1];
22 return 2;
23 }
24 fn to_be_bytes(bytes: &mut Vec<u8>, data: u16, offset: usize) -> u8 {
25 let u8_arr = data.to_be_bytes();
26 bytes[offset] = u8_arr[0];
27 bytes[offset+1] = u8_arr[1];
28 return 2;
29 }
30}
31
32impl HasByteConvert for u32 {
33 fn to_le_bytes(bytes: &mut Vec<u8>, data: u32, offset: usize) -> u8 {
34 let u8_arr = data.to_le_bytes();
35 bytes[offset] = u8_arr[0];
36 bytes[offset+1] = u8_arr[1];
37 bytes[offset+2] = u8_arr[2];
38 bytes[offset+3] = u8_arr[3];
39 return 4;
40 }
41 fn to_be_bytes(bytes: &mut Vec<u8>, data: u32, offset: usize) -> u8 {
42 let u8_arr = data.to_be_bytes();
43 bytes[offset] = u8_arr[0];
44 bytes[offset+1] = u8_arr[1];
45 bytes[offset+2] = u8_arr[2];
46 bytes[offset+3] = u8_arr[3];
47 return 4;
48 }
49}
50
51impl HasByteConvert for u64 {
52 fn to_le_bytes(bytes: &mut Vec<u8>, data: u64, offset: usize) -> u8 {
53 let u8_arr = data.to_le_bytes();
54 bytes[offset] = u8_arr[0];
55 bytes[offset+1] = u8_arr[1];
56 bytes[offset+2] = u8_arr[2];
57 bytes[offset+3] = u8_arr[3];
58 bytes[offset+4] = u8_arr[4];
59 bytes[offset+5] = u8_arr[5];
60 bytes[offset+6] = u8_arr[6];
61 bytes[offset+7] = u8_arr[7];
62 return 8;
63 }
64 fn to_be_bytes(bytes: &mut Vec<u8>, data: u64, offset: usize) -> u8 {
65 let u8_arr = data.to_be_bytes();
66 bytes[offset] = u8_arr[0];
67 bytes[offset+1] = u8_arr[1];
68 bytes[offset+2] = u8_arr[2];
69 bytes[offset+3] = u8_arr[3];
70 bytes[offset+4] = u8_arr[4];
71 bytes[offset+5] = u8_arr[5];
72 bytes[offset+6] = u8_arr[6];
73 bytes[offset+7] = u8_arr[7];
74 return 8;
75 }
76}
77
78impl HasByteConvert for i8 {
79 fn to_le_bytes(bytes: &mut Vec<u8>, data: i8, offset: usize) -> u8 {
80 bytes[offset] = data.to_le_bytes()[0];
81 return 1;
82 }
83 fn to_be_bytes(bytes: &mut Vec<u8>, data: i8, offset: usize) -> u8 {
84 bytes[offset] = data.to_be_bytes()[0];
85 return 1;
86 }
87}
88
89impl HasByteConvert for i16 {
90 fn to_le_bytes(bytes: &mut Vec<u8>, data: i16, offset: usize) -> u8 {
91 let u8_arr = data.to_le_bytes();
92 bytes[offset] = u8_arr[0];
93 bytes[offset+1] = u8_arr[1];
94 return 2;
95 }
96 fn to_be_bytes(bytes: &mut Vec<u8>, data: i16, offset: usize) -> u8 {
97 let u8_arr = data.to_be_bytes();
98 bytes[offset] = u8_arr[0];
99 bytes[offset+1] = u8_arr[1];
100 return 2;
101 }
102}
103
104impl HasByteConvert for i32 {
105 fn to_le_bytes(bytes: &mut Vec<u8>, data: i32, offset: usize) -> u8 {
106 let u8_arr = data.to_le_bytes();
107 bytes[offset] = u8_arr[0];
108 bytes[offset+1] = u8_arr[1];
109 bytes[offset+2] = u8_arr[2];
110 bytes[offset+3] = u8_arr[3];
111 return 4;
112 }
113 fn to_be_bytes(bytes: &mut Vec<u8>, data: i32, offset: usize) -> u8 {
114 let u8_arr = data.to_be_bytes();
115 bytes[offset] = u8_arr[0];
116 bytes[offset+1] = u8_arr[1];
117 bytes[offset+2] = u8_arr[2];
118 bytes[offset+3] = u8_arr[3];
119 return 4;
120 }
121}
122
123impl HasByteConvert for i64 {
124 fn to_le_bytes(bytes: &mut Vec<u8>, data: i64, offset: usize) -> u8 {
125 let u8_arr = data.to_le_bytes();
126 bytes[offset] = u8_arr[0];
127 bytes[offset+1] = u8_arr[1];
128 bytes[offset+2] = u8_arr[2];
129 bytes[offset+3] = u8_arr[3];
130 bytes[offset+4] = u8_arr[4];
131 bytes[offset+5] = u8_arr[5];
132 bytes[offset+6] = u8_arr[6];
133 bytes[offset+7] = u8_arr[7];
134 return 8;
135 }
136 fn to_be_bytes(bytes: &mut Vec<u8>, data: i64, offset: usize) -> u8 {
137 let u8_arr = data.to_be_bytes();
138 bytes[offset] = u8_arr[0];
139 bytes[offset+1] = u8_arr[1];
140 bytes[offset+2] = u8_arr[2];
141 bytes[offset+3] = u8_arr[3];
142 bytes[offset+4] = u8_arr[4];
143 bytes[offset+5] = u8_arr[5];
144 bytes[offset+6] = u8_arr[6];
145 bytes[offset+7] = u8_arr[7];
146 return 8;
147 }
148}
149
150impl HasByteConvert for f32 {
151 fn to_le_bytes(bytes: &mut Vec<u8>, data: f32, offset: usize) -> u8 {
152 let u8_arr = data.to_le_bytes();
153 bytes[offset] = u8_arr[0];
154 bytes[offset+1] = u8_arr[1];
155 bytes[offset+2] = u8_arr[2];
156 bytes[offset+3] = u8_arr[3];
157 return 4;
158 }
159 fn to_be_bytes(bytes: &mut Vec<u8>, data: f32, offset: usize) -> u8 {
160 let u8_arr = data.to_be_bytes();
161 bytes[offset] = u8_arr[0];
162 bytes[offset+1] = u8_arr[1];
163 bytes[offset+2] = u8_arr[2];
164 bytes[offset+3] = u8_arr[3];
165 return 4;
166 }
167}
168
169impl HasByteConvert for f64 {
170 fn to_le_bytes(bytes: &mut Vec<u8>, data: f64, offset: usize) -> u8 {
171 let u8_arr = data.to_le_bytes();
172 bytes[offset] = u8_arr[0];
173 bytes[offset+1] = u8_arr[1];
174 bytes[offset+2] = u8_arr[2];
175 bytes[offset+3] = u8_arr[3];
176 bytes[offset+4] = u8_arr[4];
177 bytes[offset+5] = u8_arr[5];
178 bytes[offset+6] = u8_arr[6];
179 bytes[offset+7] = u8_arr[7];
180 return 8;
181 }
182 fn to_be_bytes(bytes: &mut Vec<u8>, data: f64, offset: usize) -> u8 {
183 let u8_arr = data.to_be_bytes();
184 bytes[offset] = u8_arr[0];
185 bytes[offset+1] = u8_arr[1];
186 bytes[offset+2] = u8_arr[2];
187 bytes[offset+3] = u8_arr[3];
188 bytes[offset+4] = u8_arr[4];
189 bytes[offset+5] = u8_arr[5];
190 bytes[offset+6] = u8_arr[6];
191 bytes[offset+7] = u8_arr[7];
192 return 8;
193 }
194}
195
196pub struct Writer<'a> {
197 data: &'a mut Vec<u8>,
198 offset: usize,
199}
200
201#[allow(dead_code)]
202impl Writer<'_> {
203 pub fn get_data(&self) -> &[u8] { return &self.data[..]; }
205 pub fn get_offset(&self) -> usize { return self.offset; }
207
208 pub fn new(buf: &mut Vec<u8>) -> Writer<'_> { return Writer { data: buf, offset: 0 }; }
210
211 pub fn seek(&mut self, offset: usize, position: u8) {
213 if position == 0 {
214 self.offset = offset;
215 } else if position == 1 {
216 self.offset += offset;
217 } else {
218 self.offset = (self.data.len() as usize) - offset;
219 }
220 }
221
222 fn expand_capacity(&mut self) {
224 self.data.resize(self.data.len() * 2, 0);
225 }
226
227 fn write_i<T: HasByteConvert>(&mut self, data: T, length: u8, endianness: bool) -> u8 {
229 if self.remaining() <= length.into() {
230 self.expand_capacity()
231 }
232
233 if endianness {
234 return T::to_le_bytes(self.data, data, self.offset);
235 } else {
236 return T::to_be_bytes(self.data, data, self.offset);
237 }
238 }
239
240 pub fn trim(&mut self) {
242 self.data.truncate(self.offset);
243 }
244
245 pub fn remaining(&mut self) -> usize {
247 return self.data.len() - (self.offset + 1);
248 }
249
250 pub fn write_uint8(&mut self, data: u8, endianness: bool) -> u8 {
252 let res = self.write_i::<u8>(data, 1, endianness);
253 self.offset += 1;
254 return res;
255 }
256 pub fn write_uint16(&mut self, data: u16, endianness: bool) -> u8 {
258 let res = self.write_i::<u16>(data, 2, endianness);
259 self.offset += 2;
260 return res;
261 }
262 pub fn write_uint32(&mut self, data: u32, endianness: bool) -> u8 {
264 let res = self.write_i::<u32>(data, 4, endianness);
265 self.offset += 4;
266 return res;
267 }
268 pub fn write_uint64(&mut self, data: u64, endianness: bool) -> u8 {
270 let res = self.write_i::<u64>(data, 8, endianness);
271 self.offset += 8;
272 return res;
273 }
274
275 pub fn write_int8(&mut self, data: i8, endianness: bool) -> u8 {
277 let res = self.write_i::<i8>(data, 1, endianness);
278 self.offset += 1;
279 return res;
280 }
281 pub fn write_int16(&mut self, data: i16, endianness: bool) -> u8 {
283 let res = self.write_i::<i16>(data, 2, endianness);
284 self.offset += 2;
285 return res;
286 }
287 pub fn write_int32(&mut self, data: i32, endianness: bool) -> u8 {
289 let res = self.write_i::<i32>(data, 4, endianness);
290 self.offset += 4;
291 return res;
292 }
293 pub fn write_int64(&mut self, data: i64, endianness: bool) -> u8 {
295 let res = self.write_i::<i64>(data, 8, endianness);
296 self.offset += 8;
297 return res;
298 }
299
300 pub fn write_float32(&mut self, data: f32, endianness: bool) -> u8 {
302 let res = self.write_i::<f32>(data, 4, endianness);
303 self.offset += 4;
304 return res;
305 }
306 pub fn write_float64(&mut self, data: f64, endianness: bool) -> u8 {
308 let res = self.write_i::<f64>(data, 8, endianness);
309 self.offset += 8;
310 return res;
311 }
312
313 pub fn write_string(&mut self, data: String, prefix_with_length: bool, endianness: bool) -> u32 {
315 let str_bytes = data.into_bytes();
316 let str_bytes_len = str_bytes.len();
317 let mut length_to_return = str_bytes_len;
318
319 if prefix_with_length {
320 self.write_uint32(str_bytes_len as u32, endianness);
321 length_to_return += 4;
322 }
323
324 if self.remaining() <= str_bytes_len {
325 self.expand_capacity()
326 }
327
328 let mut i: usize = 0;
329 while i < str_bytes_len {
330 self.data[self.offset + i] = str_bytes[i];
331 i += 1;
332 }
333
334 self.data[self.offset + str_bytes_len] = 0x00;
335
336 self.offset += str_bytes_len + 1;
337
338 return length_to_return as u32;
339 }
340}