caraspace/parsers.rs
1//! Atomic units to get data from bytestreams
2
3/// Get a u8 from a bytestream and advance a position marker
4///
5/// # Arguments
6///
7/// * bs : Serialized data, stream of bytes
8/// * pos : Position marker - start postion of
9/// the deserialization
10pub fn parse_u8<T: AsRef<[u8]>>(stream : &T, pos : &mut usize) -> u8 {
11 let bs = stream.as_ref();
12 let value = u8::from_le_bytes([bs[*pos]]);
13 *pos += 1;
14 value
15}
16
17/// Get a u16 from a bytestream and advance a position marker
18///
19/// # Arguments
20///
21/// * bs : Serialized data, stream of bytes
22/// * pos : Position marker - start postion of
23/// the deserialization
24pub fn parse_u16<T: AsRef<[u8]>>(stream : &T, pos : &mut usize) -> u16 {
25 let bs = stream.as_ref();
26 let value = u16::from_le_bytes([bs[*pos], bs[*pos+1]]);
27 *pos += 2;
28 value
29}
30
31/// Get a u32 from a bytestream and advance a position marker
32///
33/// # Arguments
34///
35/// * bs : Serialized data, stream of bytes
36/// * pos : Position marker - start postion of
37/// the deserialization
38pub fn parse_u32<T: AsRef<[u8]>>(stream : &T, pos : &mut usize) -> u32 {
39 let bs = stream.as_ref();
40 let value = u32::from_le_bytes([bs[*pos], bs[*pos+1], bs[*pos+2], bs[*pos+3]]);
41 *pos += 4;
42 value
43}
44
45/// Get a u64 from a bytestream and advance a position marker
46///
47/// # Arguments
48///
49/// * bs : Serialized data, stream of bytes
50/// * pos : Position marker - start postion of
51/// the deserialization
52pub fn parse_u64<T: AsRef<[u8]>>(stream : &T, pos : &mut usize) -> u64 {
53 let bs = stream.as_ref();
54 let value = u64::from_le_bytes([bs[*pos], bs[*pos+1], bs[*pos+2], bs[*pos+3],
55 bs[*pos+4], bs[*pos+5], bs[*pos+6], bs[*pos+7]]);
56 *pos += 8;
57 value
58}
59
60/// Get a string from a bytestream and advance a position marker
61///
62/// Warning, this is unsafe and might fail. It also expects that the
63/// string is perfixed with a u16 containing its size.
64///
65/// # Arguments
66///
67/// * bs : Serialized data, stream of bytes
68/// * pos : Position marker - start postion of
69/// the deserialization
70pub fn parse_string<T: AsRef<[u8]>>(stream : &T, pos : &mut usize) -> String {
71 let bs = stream.as_ref();
72 let size = parse_u16(stream, pos) as usize;
73 let s_string : Vec<u8> = bs[*pos..*pos + size].to_vec();
74 let value = String::from_utf8(s_string).unwrap();
75 *pos += size;
76 value
77}
78
79//pub fn parse_u8_deque(bs : &VecDeque::<u8>, pos : &mut usize) -> u8 {
80// let value = u8::from_le_bytes([bs[*pos]]);
81// *pos += 1;
82// value
83//}
84//
85//
86///// Get a u16 from a bytestream and advance a position marker
87/////
88///// # Arguments
89/////
90///// * bs : Serialized data, stream of bytes
91///// * pos : Position marker - start postion of
92///// the deserialization
93//pub fn parse_u16(bs : &Vec::<u8>, pos : &mut usize) -> u16 {
94// let value = u16::from_le_bytes([bs[*pos], bs[*pos+1]]);
95// *pos += 2;
96// value
97//}
98//
99//// FIXME - make this a generic
100//pub fn parse_u16_deque(bs : &VecDeque::<u8>, pos : &mut usize) -> u16 {
101// let value = u16::from_le_bytes([bs[*pos], bs[*pos+1]]);
102// *pos += 2;
103// value
104//}
105//
106///// BIG Endian version of parse_u32. NOT for botched event id decoding!
107///// Used for network communications
108//pub fn parse_u32_be(bs : &Vec::<u8>, pos : &mut usize) -> u32 {
109// let value = u32::from_be_bytes([bs[*pos], bs[*pos+1], bs[*pos+2], bs[*pos+3]]);
110// *pos += 4;
111// value
112//}
113//
114//pub fn parse_u32(bs : &Vec::<u8>, pos : &mut usize) -> u32 {
115// let value = u32::from_le_bytes([bs[*pos], bs[*pos+1], bs[*pos+2], bs[*pos+3]]);
116// *pos += 4;
117// value
118//}
119//
120//pub fn parse_u64(bs : &Vec::<u8>, pos : &mut usize) -> u64 {
121// let value = u64::from_le_bytes([bs[*pos], bs[*pos+1], bs[*pos+2], bs[*pos+3],
122// bs[*pos+4], bs[*pos+5], bs[*pos+6], bs[*pos+7]]);
123// *pos += 8;
124// value
125//}
126//
127//#[cfg(not(target_arch="arm"))]
128//pub fn parse_usize(bs: &Vec::<u8>, pos: &mut usize) -> usize {
129// let value: usize = usize::from_le_bytes([bs[*pos],bs[*pos + 1], bs[*pos + 2], bs[*pos + 3],
130// bs[*pos + 4], bs[*pos + 5], bs[*pos + 6], bs[*pos + 7],]);
131// *pos += std::mem::size_of::<usize>();
132// value
133//}
134//
135//#[cfg(target_arch="arm")]
136//pub fn parse_usize(bs: &Vec::<u8>, pos: &mut usize) -> usize {
137// parse_u32(bs, pos) as usize
138//}
139//
140///// Get an u32 from a bytestream
141/////
142///// This assumes an underlying representation of
143///// an atomic unit of 16bit instead of 8.
144///// This is realized for the raw data stream
145///// from the readoutboards.
146//pub fn parse_u32_for_16bit_words(bs : &Vec::<u8>,
147// pos : &mut usize) -> u32 {
148//
149// let raw_bytes_4 = [bs[*pos + 2],
150// bs[*pos + 3],
151// bs[*pos ],
152// bs[*pos + 1]];
153// *pos += 4;
154// u32::from_le_bytes(raw_bytes_4)
155//}
156//
157///// Get an 48bit number from a bytestream
158/////
159///// This assumes an underlying representation of
160///// an atomic unit of 16bit instead of 8.
161///// This is realized for the raw data stream
162///// from the readoutboards.
163//pub fn parse_u48_for_16bit_words(bs : &Vec::<u8>,
164// pos : &mut usize) -> u64 {
165//
166// let raw_bytes_8 = [0u8,
167// 0u8,
168// bs[*pos + 4],
169// bs[*pos + 5],
170// bs[*pos + 2],
171// bs[*pos + 3],
172// bs[*pos ],
173// bs[*pos + 1]];
174// *pos += 6;
175// u64::from_le_bytes(raw_bytes_8)
176//}
177//
178//pub fn parse_f8(bs: &Vec<u8>, pos: &mut usize) -> f8 {
179// let value = f8::from_le_bytes([bs[*pos]]);
180// *pos += 1;
181// value
182//}
183//
184//pub fn parse_f16(bs : &Vec::<u8>, pos : &mut usize) -> f16 {
185// let value = f16::from_le_bytes([bs[*pos], bs[*pos+1]]);
186// *pos += 2;
187// value
188//}
189//
190//pub fn parse_f32(bs : &Vec::<u8>, pos : &mut usize) -> f32 {
191// let value = f32::from_le_bytes([bs[*pos], bs[*pos+1],
192// bs[*pos+2], bs[*pos+3]]);
193// *pos += 4;
194// value
195//}
196//
197//pub fn parse_f64(bs : &Vec::<u8>, pos : &mut usize) -> f64 {
198// let value = f64::from_le_bytes([bs[*pos], bs[*pos+1],
199// bs[*pos+2], bs[*pos+3],
200// bs[*pos+4], bs[*pos+5],
201// bs[*pos+6], bs[*pos+7]]);
202// *pos += 8;
203// value
204//}
205//
206//pub fn parse_bool(bs : &Vec::<u8>, pos : &mut usize) -> bool {
207// let value = u8::from_le_bytes([bs[*pos]]);
208// *pos += 1;
209// value > 0
210//}
211//
212//
213//