Rust 将二进制数据解析为基本类型的惯用方法

Rust 将二进制数据解析为基本类型的惯用方法,rust,Rust,我已经编写了以下方法,使用 fn read_原语(reader:&mut GzDecoder)->std::io::Result { 设sz=mem::size_of::(); 设mut-vec=vec:::具有_容量(sz); 让ret:T; 不安全{ 向量集_len(sz); 设mut s=&mut vec[…]; 试试!(reader.read(&mut s)); 设ptr:*常数u8=s.as_ptr(); ret=*(ptr为*常数T) } Ok(ret) } 它可以工作,但我对代码

我已经编写了以下方法,使用

fn read_原语(reader:&mut GzDecoder)->std::io::Result
{
设sz=mem::size_of::();
设mut-vec=vec:::具有_容量(sz);
让ret:T;
不安全{
向量集_len(sz);
设mut s=&mut vec[…];
试试!(reader.read(&mut s));
设ptr:*常数u8=s.as_ptr();
ret=*(ptr为*常数T)
}
Ok(ret)
}
它可以工作,但我对代码不是特别满意,尤其是使用虚拟向量和临时变量
ptr
。我觉得这一切都很不雅观,我相信有更好的方法来做到这一点。我很高兴听到关于如何清理此代码的任何建议

您的代码允许任何可复制的
T
,而不仅仅是原语。这意味着您可以尝试解析带有引用的内容,这可能不是您想要的:

#[derive(Copy)]
struct Foo(&str);
然而,您的代码的一般草图是我所期望的。您需要一个临时位置来存储一些数据,然后必须将该数据转换为适当的原语(可能处理端性问题)

我推荐图书馆。使用它,可以调用所需原语的特定方法:

reader.read_u16::<LittleEndian>()
reader.read_16::()
因为这些方法知道所需的大小,所以它们可以堆栈分配一个数组用作临时缓冲区,这可能比堆分配更有效。此外,我建议更改代码,以接受具有
Read
特征的泛型对象,而不是特定的
GzDecoder

您可能还想查看序列化库,如或,看看它们是否适合您的任何用例。

可能的重复项
reader.read_u16::<LittleEndian>()