零拷贝一步一步引用字节切片

xc *_*ang 1 reference slice rust vec

我有一个很大的Vec<u8>代表灰度图像的原始像素值。由于像素格式实际上是 16 位宽度,因此两个u8像素组成一个像素。

现在我想使用图像,就好像它是 8 位宽度一样,所以我只采用像素的较高 8 位部分。

举个例子,给定一个原始 vec v = vec![0,1,2,3,4,5],我如何通过2引用的步骤来查看它view : &[u8](无需将它们复制到新的 Vec 中以提高性能),这样就view可以等效于&[0,2,4]. 非常感谢。

Cer*_*rus 6

您所要求的确切内容是不可能的,因为根据定义,切片是连续的内存块。要拥有&[0u8, 2, 4],您需要拥有与 等效的东西[0u8, 2, 4],即这三个字节彼此直接相邻。

从概念上讲,您要求的东西看起来像stride,即产生一系列元素并跳过其中一些元素的东西。使用迭代器可以相对轻松地完成此操作,例如,如下所示

fn only_first_byte_from_pair<'a>(data: &'a [u8]) -> impl Iterator<Item = u8> + 'a {
    return data.chunks(2).map(|chunk| chunk[0])
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以查看ndarray,它具有开箱即用的相关功能,但对于实际任务来说可能有点过于复杂。