如何复制 &[u8] 切片?
How do I duplicate a &[u8] slice?
如何复制 &[u8]
切片的内容?
我正在尝试编写一个将缓冲区作为输入和 XOR 的函数
具有给定键的每个字节和 returns 最终结果。
我不希望它破坏输入缓冲区。
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 行没有克隆缓冲区,它正在克隆指向它的指针。如果您将绑定更改为
let mut buffer_out: &[u8] = buffer_in.clone();
你得到同样的错误。如果你想要一个切片的独立副本,你需要把它变成一个 Vec
或其他一些拥有的容器类型;这可以通过使用 buffer_in.to_owned()
来完成(通常从借来的东西变成拥有的等价物)。
其次,您不能 return 借用您在函数中创建的内容。你不能。不完全是。不,甚至没有那样做。或者那个。如果 return 值是 直接 借来的,您可以 仅 return 借用(如 &[u8]
)你的论点之一。这在这里不是真的,所以 return 类型 必须 是 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()
}
如何复制 &[u8]
切片的内容?
我正在尝试编写一个将缓冲区作为输入和 XOR 的函数 具有给定键的每个字节和 returns 最终结果。
我不希望它破坏输入缓冲区。
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 行没有克隆缓冲区,它正在克隆指向它的指针。如果您将绑定更改为
let mut buffer_out: &[u8] = buffer_in.clone();
你得到同样的错误。如果你想要一个切片的独立副本,你需要把它变成一个 Vec
或其他一些拥有的容器类型;这可以通过使用 buffer_in.to_owned()
来完成(通常从借来的东西变成拥有的等价物)。
其次,您不能 return 借用您在函数中创建的内容。你不能。不完全是。不,甚至没有那样做。或者那个。如果 return 值是 直接 借来的,您可以 仅 return 借用(如 &[u8]
)你的论点之一。这在这里不是真的,所以 return 类型 必须 是 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()
}