< 返回版块

bell 发表于 2021-08-04 08:26

data是从文件读取的bytes数据。如何截取data中指定位置区间的数据到指定类型的Vector中(注意不能影响data),有点类似于protobuff之类的协议解析。

评论区

写评论
作者 bell 2021-08-06 07:45

感谢,好像nom也可以实现

--
👇
Bai-Jinlin: 我随手写了一个,你要的是不是这个效果?

use std::mem::size_of;

fn TArray<'a, T>(buffer: &'a [u8], offset: usize, len: usize) -> Option<Vec<T>>
where
    T: serde::Deserialize<'a>,
{
    let buffer = buffer.get(offset..)?;
    if buffer.len() < size_of::<T>() * len {
        return None;
    }
    let mut v = Vec::with_capacity(len);
    for i in 0..len {
        let i = i * size_of::<T>();
        let d = bincode::deserialize::<T>(&buffer[i..i + size_of::<T>()]);
        v.push(d.ok()?);
    }
    Some(v)
}

fn main() {
    let a = [
        5, 5, 5, 5, 247, 28, 0, 0, 61, 2, 0, 0, 26, 0, 0, 0, 5, 5, 5, 5,
    ];
    let v = TArray::<i32>(&a, 4, 3);
    assert_eq!(v, Some(vec![7415, 573, 26]));
}
Bai-Jinlin 2021-08-04 22:35

我随手写了一个,你要的是不是这个效果?

use std::mem::size_of;

fn TArray<'a, T>(buffer: &'a [u8], offset: usize, len: usize) -> Option<Vec<T>>
where
    T: serde::Deserialize<'a>,
{
    let buffer = buffer.get(offset..)?;
    if buffer.len() < size_of::<T>() * len {
        return None;
    }
    let mut v = Vec::with_capacity(len);
    for i in 0..len {
        let i = i * size_of::<T>();
        let d = bincode::deserialize::<T>(&buffer[i..i + size_of::<T>()]);
        v.push(d.ok()?);
    }
    Some(v)
}

fn main() {
    let a = [
        5, 5, 5, 5, 247, 28, 0, 0, 61, 2, 0, 0, 26, 0, 0, 0, 5, 5, 5, 5,
    ];
    let v = TArray::<i32>(&a, 4, 3);
    assert_eq!(v, Some(vec![7415, 573, 26]));
}
作者 bell 2021-08-04 20:40

类似于js中 new Int32Array(data, 16, 2) new Float32Array(data, 80, 2) 这种 bincode是按照序列化成指定类型的vector 好像需要的不是这种

👇
Bai-Jinlin: bincode

Bai-Jinlin 2021-08-04 13:31

bincode

1 共 4 条评论, 1 页