如何复制&[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
}
Run Code Online (Sandbox Code Playgroud)
此代码生成以下编译时错误:
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[..] {
^~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)
我知道我必须做错事.
任何帮助都会得到赞赏.
DK.*_*DK. 13
首先,你不能clone一个[T](不考虑T).第3行没有克隆缓冲区,它正在克隆指向它的指针.如果您将绑定更改为
let mut buffer_out: &[u8] = buffer_in.clone();
Run Code Online (Sandbox Code Playgroud)
你得到同样的错误.如果需要切片的独立副本,则需要将其转换为一个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()
}
Run Code Online (Sandbox Code Playgroud)