2016-02-27 47 views
2

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

我正在尝试编写一个函数,该函数将缓冲区作为输入并使用给定键对每个字节进行异或运算,然后返回最终结果。

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

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[..] { 
               ^~~~~~~~~~ 

我知道我必须做一些错误。

任何帮助将会得到赞扬。

回答

11

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

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() 
}