2016-02-27 98 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() 
}