У меня есть буфер типа 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 в ржавчине?