提问人:xc wang 提问时间:11/7/2023 最后编辑:abencixc wang 更新时间:11/8/2023 访问量:49
零拷贝按步骤引用字节片
Zero-copy reference a slice of bytes by a step
问:
我有一个大号表示灰色图像的原始像素值。由于像素格式实际上是 16 位宽度,因此两个等于一个像素。Vec<u8>
u8
现在,我想将图像用作 8 位宽度,因此我只取像素中较高的 8 位部分。
例如,给定一个原始 vec ,我如何通过一步到引用来查看它(为了性能,无需将它们复制到新的 Vec 中),这样就可以等效于 .非常感谢。v = vec![0,1,2,3,4,5]
2
view : &[u8]
view
&[0,2,4]
答:
6赞
Cerberus
11/7/2023
#1
你所要求的确切内容是不可能的,因为根据定义,切片是连续的内存块。要有一个 ,你需要有等价的东西,即这三个字节直接并排放置。&[0u8, 2, 4]
[0u8, 2, 4]
你在概念上要求的东西看起来像一个大步,也就是说,在跳过其中一些元素的同时产生一系列元素的东西。这可以通过迭代器相对容易地完成,例如,如下所示:
fn only_first_byte_from_pair<'a>(data: &'a [u8]) -> impl Iterator<Item = u8> + 'a {
return data.chunks(2).map(|chunk| chunk[0])
}
或者,您可以查看 ndarray
,它具有开箱即用的相关功能,但对于实际任务来说可能有点太复杂了。
评论
0赞
Chayim Friedman
11/9/2023
如果您需要比简单迭代器(例如,索引)更多的功能,但没有 的全部功能,则可以创建类似切片的包装器结构。ndarray
评论