如何更新 Bytes/BytesMut 的一部分?
How do I update a section of a Bytes/BytesMut?
我在 Bytes
结构中有一个固定大小的缓冲区,我想在其中复制一些数据。
目前我唯一能看到的就是从开头切一部分,添加我想要的,然后在末尾添加切片,但我相信这会导致一个大副本或我想避免的两个,我只需要更新缓冲区的中间部分。有没有不使用 unsafe
的简单方法?
你不要变异Bytes
。该结构的全部目的是表示数据的引用计数不可变视图。您将需要以某种方式复制数据。也许您从数据中创建了 Vec<u8>
或 BytesMut
。
BytesMut
实现了 AsMut<[u8]>
、BorrowMut<[u8]>
和 DerefMut
,因此您可以使用任何现有技术就地修改切片。例如:
use bytes::BytesMut; // 0.5.4
fn main() {
let mut b = BytesMut::new();
b.extend_from_slice(b"a good time");
let middle = &mut b[2..][..4];
middle.copy_from_slice(b"cool");
println!("{}", String::from_utf8_lossy(&b));
}
另请参阅:
- How do you copy between arrays of different sizes in Rust?
- How do I create two new mutable slices from one slice?
without using unsafe
不要使用 unsafe
这个问题。你将导致未定义的行为。
我在 Bytes
结构中有一个固定大小的缓冲区,我想在其中复制一些数据。
目前我唯一能看到的就是从开头切一部分,添加我想要的,然后在末尾添加切片,但我相信这会导致一个大副本或我想避免的两个,我只需要更新缓冲区的中间部分。有没有不使用 unsafe
的简单方法?
你不要变异Bytes
。该结构的全部目的是表示数据的引用计数不可变视图。您将需要以某种方式复制数据。也许您从数据中创建了 Vec<u8>
或 BytesMut
。
BytesMut
实现了 AsMut<[u8]>
、BorrowMut<[u8]>
和 DerefMut
,因此您可以使用任何现有技术就地修改切片。例如:
use bytes::BytesMut; // 0.5.4
fn main() {
let mut b = BytesMut::new();
b.extend_from_slice(b"a good time");
let middle = &mut b[2..][..4];
middle.copy_from_slice(b"cool");
println!("{}", String::from_utf8_lossy(&b));
}
另请参阅:
- How do you copy between arrays of different sizes in Rust?
- How do I create two new mutable slices from one slice?
without using
unsafe
不要使用 unsafe
这个问题。你将导致未定义的行为。