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

标签 vector rust hashmap bytebuffer

我在HashMap<Vec<u8>, Vec<u8>>中有数据,我想将该数据作为字节缓冲区(单个Vec<u8>)写入文件,然后从文件中读取回去并重建HashMap结构。
是否有建立像这样的平坦化和恢复 map 的算法?我可以将元数据写入文件中,以区分数据分区的位置。由于该项目的性质,我无法使用结构化序列化-我正在加密数据和文件。

最佳答案

您可以使用以下格式存储它:value1_len | value1_bytes | key1_len | key1_bytes | value2_len | value2_bytes | key2_len | key2_bytes | ...使用标准库(playground)可以轻松完成:

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);
}

关于vector - 将Map <Vec <u8>,Vec <u8 >>展平为Vec <u8>,然后将其返回到Map <Vec <u8>,Vec <u8 >>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62784751/

相关文章:

vector - 支持矢量扩展的 RISC-V 仿真器

Android HashMap 序列化/反序列化

java - 类之间的 HashMap 不一致 - Java

hashmap - VacantEntry 未在名为 set 的范围内实现任何方法

random - 如何在 Rust 中生成一个范围内的随机数?

windows - Windows 上的 Rust 回溯?

algorithm - 查找具有 n-1 个相等分量的向量

c++ - 为什么我的编译器对 c 字符串类型的 vector 有内存问题?

c++ - 将 vector 幅度减小特定长度的有效方法?

rust - 在循环中使用read_line时出现奇怪的行为