如何更新 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 这个问题。你导致未定义的行为。