Чтение определенной c байтовой длины вектора байтового массива в ржавчине - PullRequest
1 голос
/ 10 июля 2020

У меня есть буфер типа Vec<u8>, который является представлением кодировки следующим образом, где u16 - длина 16 байт, указывающая размер сообщения, а d1..6 - это данные:

+----+----+----+----+----+----+----+----+----------------------------
| b1 | b2 | d1 | d2 | d3 | d4 | d5 | d6 | b1 | b2 | d11 | d12 | ...
+----+----+----+----+----+----+----+----+----------------------------

В настоящее время я десериализирую это, выполнив следующие действия (например, 8 байтов):

use std::io::Cursor;
use byteorder::{ReadBytesExt, BigEndian};

pub struct Message {
    pub data: Vec<u8>
}

fn deserialize_buffer(buffer: Vec<u8>) -> Message {
    let buffer_copy = buffer.to_vec();
    let mut r = Cursor::new(buffer);

    let data_length: u16 = r.read_u16::<BigEndian>().unwrap();
    if data_length + 2 > buffer_copy.len() as u16 {
        panic!("Invalid Encoding Length");
    }

    let mut data: Vec<u8> = vec![];
    for i in 0..data_length {
        data.insert(i as usize, r.read_u8().unwrap());
    }

    Message{data}
}

Есть ли лучший способ читать и сохранять точное количество байтов с Cursor вместо использования for l oop в ржавчине?

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