Arrays 在rust中读取字节数组向量的特定字节长度
我有一个Arrays 在rust中读取字节数组向量的特定字节长度,arrays,rust,Arrays,Rust,我有一个Vec类型的缓冲区,它是如下所示的编码表示,其中u16是消息大小的16字节长度指示,d1..6是数据: +----+----+----+----+----+----+----+----+---------------------------- | b1 | b2 | d1 | d2 | d3 | d4 | d5 | d6 | b1 | b2 | d11 | d12 | ... +----+----+----+----+----+----+----+----+---------------
Vec
类型的缓冲区,它是如下所示的编码表示,其中u16
是消息大小的16字节长度指示,d1..6
是数据:
+----+----+----+----+----+----+----+----+----------------------------
| b1 | b2 | d1 | d2 | d3 | d4 | d5 | d6 | b1 | b2 | d11 | d12 | ...
+----+----+----+----+----+----+----+----+----------------------------
我目前正在通过执行以下操作(例如8个字节)来反序列化此文件:
使用std::io::Cursor;
使用字节顺序::{ReadBytesExt,BigEndian};
发布结构消息{
发布数据:Vec
}
fn反序列化_buffer(buffer:Vec)->消息{
让buffer_copy=buffer.to_vec();
让mut r=Cursor::new(缓冲区);
让数据_length:u16=r.read_u16::().unwrap();
如果数据长度+2>buffer\u copy.len()为u16{
恐慌!(“无效编码长度”);
}
让mut data:Vec=Vec![];
对于0.数据长度中的i{
data.insert(i as usize,r.read_u8().unwrap());
}
消息{data}
}
有没有更好的方法来使用
游标来读取和存储确切的字节数
,而不是在rust中使用for
循环?如果您要读取u8
,那么您可以使用游标
中的Vec
:,如果您克隆缓冲区的长度而不是它本身,也会更好,因为你只需要长度,否则那将是一种浪费谢谢@ÖmerErden这确实很有帮助,但是我在寻找一个n
字节读取器,用于我的输入缓冲区有多个这样的数据块的情况bbdddbdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd也澄清了问题。再次感谢@Ömererdeni如果您打算阅读u8
中剩余的内容,您可以从Cursor
中使用Vec
:,而且如果您克隆缓冲区的长度而不是它本身,也会更好,因为您只需要长度,否则这将是一种浪费。谢谢@merErden,这确实很有帮助,但是我在寻找一个n
字节读取器,用于我的输入缓冲区有多个这样的数据块的情况bbdddbdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd也澄清了问题。再次感谢@ÖmerErden
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}
}