Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在rust中读取字节数组向量的特定字节长度_Arrays_Rust - Fatal编程技术网

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}
}