将 Map<Vec, Vec> 展平为 Vec,然后将其<u8><u8><u8>返回到 Map<Vec<u8>, Vec<u8&



我在HashMap<Vec<u8>, Vec<u8>>中有数据,我想将该数据作为字节缓冲区(单个Vec<u8>(写入文件,然后从文件中读回并重建HashMap结构。

有没有一个既定的算法来压平和恢复这样的地图?我可以将元数据写入文件中,以区分数据分区的位置等。由于这个项目的性质,我不能使用结构化序列化——我正在加密数据和文件。

您可以使用以下格式存储:

value1_len | value1_bytes | key1_len | key1_bytes | value2_len | value2_bytes | key2_len | key2_bytes | ...

使用标准图书馆(操场(可以很容易地完成什么:

use std::collections::HashMap;
use std::convert::TryInto;
fn serialize(map: &HashMap<Vec<u8>, Vec<u8>>) -> Vec<u8> {
map.iter().fold(Vec::new(), |mut acc, (k, v)| {
acc.extend(&k.len().to_le_bytes());
acc.extend(k.as_slice());
acc.extend(&v.len().to_le_bytes());
acc.extend(v.as_slice());
acc
})
}
fn read_vec(input: &mut &[u8]) -> Vec<u8> {
let (len, rest) = input.split_at(std::mem::size_of::<usize>());
let len = usize::from_le_bytes(len.try_into().unwrap());
let (v, rest) = rest.split_at(len);
*input = rest;
v.to_vec()
}
fn deserialize(bytes: &Vec<u8>) -> HashMap<Vec<u8>, Vec<u8>> {
let mut map = HashMap::new();
let mut left = &bytes[..];
while left.len() > 0 {
let k = read_vec(&mut left);
let v = read_vec(&mut left);
map.insert(k, v);
}
map
}
fn main() {
let mut map = HashMap::new();
map.insert(vec![1, 2, 3], vec![4, 5, 6]);
map.insert(vec![4, 5, 6], vec![1, 2, 3]);
map.insert(vec![1, 5, 3], vec![4, 2, 6]);
let array = serialize(&map);
let recovered_map = deserialize(&array);
assert_eq!(map, recovered_map);
}

相关内容

最新更新