【问题标题】:How do I update a section of a Bytes/BytesMut?如何更新 Bytes/BytesMut 的一部分?
【发布时间】:2020-09-13 16:48:04
【问题描述】:

我在 Bytes 结构中有一个固定大小的缓冲区,我想在其中复制一些数据。

目前我唯一能看到的就是从开头截取一部分,添加我想要的部分,然后在结尾添加部分,但我确信这会导致一两个大副本我想避免,我只需要更新缓冲区的中间部分。有没有不使用unsafe 的简单方法?

【问题讨论】:

    标签: rust buffer


    【解决方案1】:

    不要改变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));
    }
    

    另见:

    不使用unsafe

    请勿使用unsafe 解决此问题。您导致未定义的行为。

    【讨论】:

    • 好的...这基本上就是我想要的谢谢,我知道我不能改变字节,但我也没有看到如何从字节中获得可变性。是的,我不想使用 unsafe。
    • @stu 有unsafe,然后有unsafe。我的意思是,在某些情况下您可以使用unsafe,即使您可能不想这样做,并且在某些情况下您想要的东西在语言规则范围内是不可能的,而您不得 使用unsafe 来破坏它们。这是第二种情况。如果你有一个Bytes,你不能改变它,句号。你必须回到代码给你Bytes的地方,并以某种方式说服它给你BytesMut
    猜你喜欢
    • 1970-01-01
    • 2019-02-04
    • 2023-03-18
    • 1970-01-01
    • 2012-05-16
    • 2011-03-07
    • 1970-01-01
    • 2016-06-22
    • 2015-05-14
    相关资源
    最近更新 更多