datex_core/utils/
buffers.rs

1use byteorder::{LittleEndian, ReadBytesExt};
2use itertools::Itertools;
3use core::fmt::Write;
4
5/*
6read functions for primitive data types on a u8 array, also increments the index
7 */
8
9pub 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	// end is min(index+size, buffer len)
64	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
78/*
79write functions: set value at specific index in byte vector, vector length must be big enough
80append functions: appends the value at the end of the byte vector, automatically increases size
81 */
82
83
84pub 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
180// hex - buffer conversions
181
182pub 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
192/**
193 * seperator: char sequence inserted between each byte
194 * pad_size_bytes: if 0, it is ignored
195 * x_shorthand: collapse multiple 0 bytes to "xC", with C being the number of zero bytes
196 */
197pub 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		// next byte
206		let byte = if i<buf_len {buffer[i]} else {0};
207		i += 1;
208		// multiple (>=2) zero bytes - x shorthand
209		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			// 0 count, max 15
217			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		// normal
228		else {
229			write!(s, "{:02X}", byte).expect("could not parse buffer");
230		}
231
232		// seperator?
233		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}