7

如何复制&[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[..] {
                                               ^~~~~~~~~~

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

任何帮助将不胜感激。

4

1 回答 1

16

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

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

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

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

第三,制作数组的副本然后对其进行变异可能效率低下。理想情况下,您希望尽可能少地进行修改(同时避免更的事情,例如不必要的分配)。您可以使用迭代器来做到这一点。

第四,不能保证key的值实际上适合 a 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()
}
于 2016-02-27T02:00:18.860 回答