1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
use std::str; use std::convert::TryFrom; pub fn serialize_str(obj: (String, String)) -> Vec<u8> { let value_type: Vec<u8> = 1_u8.to_le_bytes().to_vec(); let key: String = obj.0; let key_bytes: Vec<u8> = key.into_bytes(); let value: String = obj.1; let value_bytes: Vec<u8> = value.into_bytes(); let key_bytes_length = u8::try_from(key_bytes.len()); match key_bytes_length { Ok(len) => { let result: Vec<u8> = [ value_type, len.to_le_bytes().to_vec(), key_bytes, value_bytes ].concat(); return result }, Err(_) => return vec![] } } pub fn deserialize_str(vec: Vec<u8>) -> (String, String) { let key_length = usize::from_le(vec[1].into()); let key_slice = &vec[2..key_length + 2]; let value_slice = &vec[key_length + 2..vec.len()]; let key = str::from_utf8(key_slice).unwrap().to_string(); let value = str::from_utf8(value_slice).unwrap().to_string(); return (key, value) } pub fn encode(list: &Vec<Vec<u8>>) -> Vec<u8> { let obj_sizes: Vec<usize> = list.into_iter().map(|x| x.len()).collect(); let mut current_index = obj_sizes.len() * 8; let mut result: Vec<u8> = Vec::new(); for x in &obj_sizes[0..obj_sizes.len()] { let index = current_index.to_le_bytes().to_vec(); result = [result, index].concat(); current_index += x; } for obj in list { result = [result, obj.to_vec()].concat(); } return result; }