基本上,我有一个基于tcp的网络协议要解析.

在C语言中,我可以将一些内存转换为我想要的类型.我怎样才能用Rust 来完成类似的事情呢.

推荐答案

你也可以在铁 rust 上做同样的事情.你只需要在定义 struct 时稍微小心一点.

use std::mem;

#[repr(C)]
#[packed]
struct YourProtoHeader {
    magic: u8,
    len: u32
}

let mut buf = [0u8, ..1024];  // large enough buffer

// read header from some Reader (a socket, perhaps)
reader.read_at_least(mem::size_of::<YourProtoHeader>(), buf.as_mut_slice()).unwrap();

let ptr: *const u8 = buf.as_ptr();
let ptr: *const YourProtoHeader = ptr as *const YourProtoHeader;
let ptr: &YourProtoHeader = unsafe { &*ptr };

println!("Data length: {}", ptr.len);

不幸的是,我不知道如何将缓冲区的大小精确地指定为size_of::<YourProtoHeader>();缓冲区长度必须是一个常数,但size_of()调用从技术上讲是一个函数,所以在数组初始值设定项中使用它时会出现Rust 的问题.然而,足够大的缓冲区也会起作用.

在这里,我们将一个指向缓冲区开头的指针转换为指向您的 struct 的指针.这与在C中所做的相同. struct 本身应该用#[repr(C)]#[pack]个属性进行注释:第一个属性不允许可能的字段重新排序,第二个属性不允许字段对齐的填充.

Rust相关问答推荐

我怎样才能从一个Rust 的日期中go 掉3年?

如何将`Join_all``Vec<;Result<;Vec<;Foo&>;,Anywhere::Error&>;`合并到`Result<;Vec<;Foo&>;,Anywhere::Error&>;`

当rust中不存在文件或目录时,std::FS::File::Create().unwire()会抛出错误

这个规则关于或模式到底是什么意思?如果表达片段的类型与p_i|q_i...&q;不一致,就会形成

你是如何在铁 rust 一侧的金牛座获得应用程序版本的?

如何点击()迭代器?

类型批注需要静态生存期

如何返回 struct 体中向量的切片

Rust 重写函数参数

为什么某些类型参数仅在特征边界中使用的代码在没有 PhantomData 的情况下进行编译?

当没有实际结果时,如何在 Rust 中强制执行错误处理?

Rust编译器通过哪些规则来确保锁被释放?

枚举的利基优化如何在 Rust 中工作?

使用 traits 时,borrow 的值不会存在足够长的时间

Rust 将特性传递给依赖项

字符串切片的向量超出范围但原始字符串仍然存在,为什么判断器说有错误?

将数据序列化为 struct 模型,其中两个字段的数据是根据 struct 中的其他字段计算的

为什么我可以从读取的可变自引用中移出?

在传输不可复制的值时实现就地枚举修改

使用循环移位计算排序数组的交集的快速算法