Как мне обновить раздел Bytes / BytesMut? - PullRequest
0 голосов
/ 26 мая 2020

У меня есть буфер фиксированного размера в структуре Bytes, и я хочу скопировать некоторые данные в его середину.

Единственное, что я сейчас вижу, - это взять срез в начале, добавить то, что я хочу, и добавить срез в конце, но я уверен, что это приведет к получению одной или двух больших копий, которых я хочу избежать, мне просто нужно обновить середину буфера. Есть ли простой способ сделать это без использования unsafe?

1 Ответ

2 голосов
/ 26 мая 2020

Вы не мутируете 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 для этой проблемы . Вы вызовете неопределенное поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...