datex_core/utils/
buffers.rs1use byteorder::{LittleEndian, ReadBytesExt};
2use itertools::Itertools;
3use core::fmt::Write;
4
5pub fn read_u8(buffer: &[u8], index: &mut usize) -> u8 {
10 let val = buffer[*index];
11 *index += 1;
12 return val;
13}
14
15
16pub fn read_i8(buffer: &[u8], index: &mut usize) -> i8 {
17 let mut slice = &buffer[*index..*index+1];
18 *index += 1;
19 return slice.read_i8().unwrap();
20}
21
22pub fn read_u16(buffer: &[u8], index: &mut usize) -> u16 {
23 let mut slice = &buffer[*index..*index+2];
24 *index += 2;
25 return slice.read_u16::<LittleEndian>().unwrap();
26}
27pub fn read_i16(buffer: &[u8], index: &mut usize) -> i16 {
28 let mut slice = &buffer[*index..*index+2];
29 *index += 2;
30 return slice.read_i16::<LittleEndian>().unwrap();
31}
32
33pub fn read_i32(buffer: &[u8], index: &mut usize) -> i32 {
34 let mut slice = &buffer[*index..*index+4];
35 *index += 4;
36 return slice.read_i32::<LittleEndian>().unwrap();
37}
38pub fn read_u32(buffer: &[u8], index: &mut usize) -> u32 {
39 let mut slice = &buffer[*index..*index+4];
40 *index += 4;
41 return slice.read_u32::<LittleEndian>().unwrap();
42}
43
44pub fn read_u64(buffer: &[u8], index: &mut usize) -> u64 {
45 let mut slice = &buffer[*index..*index+8];
46 *index += 8;
47 return slice.read_u64::<LittleEndian>().unwrap();
48}
49pub fn read_i64(buffer: &[u8], index: &mut usize) -> i64 {
50 let mut slice = &buffer[*index..*index+8];
51 *index += 8;
52 return slice.read_i64::<LittleEndian>().unwrap();
53}
54
55pub fn read_f64(buffer: &[u8], index: &mut usize) -> f64 {
56 let mut slice = &buffer[*index..*index+8];
57 *index += 8;
58 return slice.read_f64::<LittleEndian>().unwrap();
59}
60
61
62pub fn read_string_utf8(buffer: &[u8], index: &mut usize, size: usize) -> String {
63 let end = if *index+size > buffer.len() {buffer.len()} else {*index+size};
65 let slice = &buffer[*index..end];
66 *index = end;
67 return String::from_utf8(slice.to_vec()).unwrap_or("⎣INVALID UTF8 STRING⎤".to_string());
68}
69
70pub fn read_slice(buffer: &[u8], index: &mut usize, size: usize) -> Vec<u8> {
71 let slice = &buffer[*index..*index+size];
72 *index += size;
73 return slice.to_vec();
74}
75
76
77
78pub fn write_u8(buffer: &mut Vec<u8>, index: &mut usize, val: u8) {
85 buffer[*index] = val;
86 *index += 1;
87}
88pub fn append_u8(buffer: &mut Vec<u8>, val: u8) {
89 buffer.extend_from_slice(&[val]);
90}
91pub fn write_i8(buffer: &mut Vec<u8>, index: &mut usize, val: i8) {
92 let bytes = val.to_le_bytes();
93 for b in bytes {
94 buffer[*index] = b;
95 *index += 1;
96 }
97}
98pub fn append_i8(buffer: &mut Vec<u8>, val: i8) {
99 buffer.extend_from_slice(&val.to_le_bytes());
100}
101
102pub fn write_u16(buffer: &mut Vec<u8>, index: &mut usize, val: u16) {
103 let bytes = val.to_le_bytes();
104 for b in bytes {
105 buffer[*index] = b;
106 *index += 1;
107 }
108}
109pub fn append_u16(buffer: &mut Vec<u8>, val: u16) {
110 buffer.extend_from_slice(&val.to_le_bytes());
111}
112pub fn write_i16(buffer: &mut Vec<u8>, index: &mut usize, val: i16) {
113 let bytes = val.to_le_bytes();
114 for b in bytes {
115 buffer[*index] = b;
116 *index += 1;
117 }
118}
119pub fn append_i16(buffer: &mut Vec<u8>, val: i16) {
120 buffer.extend_from_slice(&val.to_le_bytes());
121}
122
123pub fn write_u32(buffer: &mut Vec<u8>, index: &mut usize, val: u32) {
124 let bytes = val.to_le_bytes();
125 for b in bytes {
126 buffer[*index] = b;
127 *index += 1;
128 }
129}
130pub fn append_u32(buffer: &mut Vec<u8>, val: u32) {
131 buffer.extend_from_slice(&val.to_le_bytes());
132}
133pub fn write_i32(buffer: &mut Vec<u8>, index: &mut usize, val: i32) {
134 let bytes = val.to_le_bytes();
135 for b in bytes {
136 buffer[*index] = b;
137 *index += 1;
138 }
139}
140pub fn append_i32(buffer: &mut Vec<u8>, val: i32) {
141 buffer.extend_from_slice(&val.to_le_bytes());
142}
143
144pub fn write_u64(buffer: &mut Vec<u8>, index: &mut usize, val: u64) {
145 let bytes = val.to_le_bytes();
146 for b in bytes {
147 buffer[*index] = b;
148 *index += 1;
149 }
150}
151pub fn append_u64(buffer: &mut Vec<u8>, val: u64) {
152 buffer.extend_from_slice(&val.to_le_bytes());
153}
154pub fn write_i64(buffer: &mut Vec<u8>, index: &mut usize, val: i64) {
155 let bytes = val.to_le_bytes();
156 for b in bytes {
157 buffer[*index] = b;
158 *index += 1;
159 }
160}
161pub fn append_i64(buffer: &mut Vec<u8>, val: i64) {
162 buffer.extend_from_slice(&val.to_le_bytes());
163}
164
165pub fn write_f64(buffer: &mut Vec<u8>, index: &mut usize, val: f64) {
166 let bytes = val.to_le_bytes();
167 for b in bytes {
168 buffer[*index] = b;
169 *index += 1;
170 }
171}
172pub fn append_f64(buffer: &mut Vec<u8>, val: f64) {
173 buffer.extend_from_slice(&val.to_le_bytes());
174}
175
176pub fn append_string_utf8(buffer: &mut Vec<u8>, val: &str) {
177 buffer.extend_from_slice(val.as_bytes());
178}
179
180pub fn buffer_to_hex(buffer:Vec<u8>) -> String {
183 let n = buffer.len();
184
185 let mut s = String::with_capacity(2 * n);
186 for byte in buffer {
187 write!(s, "{:02X}", byte).expect("could not parse buffer")
188 }
189 return s;
190}
191
192pub fn buffer_to_hex_advanced(buffer:Vec<u8>, seperator:&str, pad_size_bytes:usize, x_shorthand:bool) -> String {
198 let n = if pad_size_bytes==0 {buffer.len()} else {pad_size_bytes};
199
200 let buf_len = buffer.len();
201
202 let mut s = String::with_capacity(2 * n);
203 let mut i = 0;
204 while i < n {
205 let byte = if i<buf_len {buffer[i]} else {0};
207 i += 1;
208 if x_shorthand && byte == 0 && i < n && if i<buf_len {buffer[i]} else {0} == 0 {
210 let mut zero_count:u8 = 2;
211 let initial_i = i;
212 while i+1 < n && buffer[i+1] == 0 {
213 i += 1;
214 zero_count += 1;
215 }
216 if zero_count <= 0xf {
218 i += 1;
219 write!(s, "x{:01X}", zero_count).expect("could not parse buffer");
220 }
221 else {
222 i = initial_i;
223 write!(s, "{:02X}", byte).expect("could not parse buffer");
224 }
225
226 }
227 else {
229 write!(s, "{:02X}", byte).expect("could not parse buffer");
230 }
231
232 if seperator.len()!=0 && i<n {
234 s += seperator;
235 }
236 }
237
238 return s;
239}
240
241
242pub fn hex_to_buffer(hex:String) -> Vec<u8> {
243 let mut buffer = Vec::<u8>::new();
244
245 for chunk in &hex.chars().chunks(2) {
246 buffer.push(u8::from_str_radix(&String::from_iter(chunk), 16).expect("invalid hex buffer"));
247 };
248
249 return buffer;
250}
251
252pub fn hex_to_buffer_advanced(hex:String, seperator:&str) -> Vec<u8> {
253 let mut buffer = Vec::<u8>::new();
254
255 let raw_hex = hex.replace(seperator, "");
256
257 for chunk in &raw_hex.chars().chunks(2) {
258 let part = &String::from_iter(chunk);
259 if part.starts_with("x") {
260 let count = u8::from_str_radix(part.split_at(1).1, 16).expect("invalid x shortcut");
261 for _i in 0..count {
262 buffer.push(0);
263 }
264 }
265 else {
266 buffer.push(u8::from_str_radix(part, 16).expect("invalid hex buffer"));
267 }
268 };
269
270 return buffer;
271}