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//