gpt4 book ai didi

rust - 如何复制 &[u8] 切片?

转载 作者:行者123 更新时间:2023-11-29 07:49:20 25 4
gpt4 key购买 nike

如何复制 &[u8] 切片的内容?

我正在尝试编写一个将缓冲区作为输入和 XOR 的函数给定键的每个字节并返回最终结果。

我不希望它破坏输入缓冲区。

pub fn xor_buffer(buffer_in: &[u8], key: char) -> &[u8] {

let mut buffer_out = buffer_in.clone();

for byte in &mut buffer_out[..] {
*byte ^= key as u8;
}

buffer_out
}

此代码生成以下编译时错误:

src/test.rs:29:22: 29:32 error: cannot borrow immutable borrowed content `*buffer_out` as mutable
src/test.rs:29 for byte in &mut buffer_out[..] {
^~~~~~~~~~

我知道我一定是做错了什么。

如有任何帮助,我们将不胜感激。

最佳答案

首先,你不能clone一个[T] (不考虑 T )。第 3 行不是克隆缓冲区,它是克隆指向它的指针。如果您将绑定(bind)更改为

let mut buffer_out: &[u8] = buffer_in.clone();

你得到同样的错误。如果你想要一个切片的独立副本,你需要把它变成一个 Vec或其他一些拥有的容器类型;这可以通过使用 buffer_in.to_owned() 来完成(通常从借来的东西到拥有的等价物)。

其次,您不能返回对您在函数中创建的东西的借用。你不能。不完全是。不,甚至没有那样做。或者那个。如果返回值是直接从您的参数之一借来的,您只能返回借用(如&[u8])。这在这里不是真的,所以返回类型必须Vec<u8>或其他拥有的东西。

第三,复制数组然后然后改变它可能是低效的。理想情况下,您希望尽可能少地进行修改(同时避免甚至较慢的事情,例如不必要的分配)。您可以使用迭代器来做到这一点。

四、没有保证key的值实际上适合 u8 .您可能应该将其更改为 key: u8让调用者清楚值的有效范围是什么。

所以,总而言之:

pub fn xor_buffer(buffer_in: &[u8], key: u8) -> Vec<u8> {
// Get an iterator of `&u8`s from `buffer_in`.
buffer_in.iter()
// Replace each element with the xor'ed value.
.map(|byte| *byte ^ key)
// Collect the iterator into an owned collection.
.collect()
}

关于rust - 如何复制 &[u8] 切片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35664419/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com