基本上我有一个基于tcp的网络协议来解析。
在C中,我可以将一些内存转换为我想要的类型。我怎样才能完成与Rust类似的东西。
答案 0 :(得分:7)
你也可以在Rust做同样的事情。在定义结构时,您必须要小心。
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会抱怨。然而,足够大的缓冲区也会起作用。
这里我们将指向缓冲区开头的指针转换为指向结构的指针。这与您在C中执行的操作相同。结构本身应使用#[repr(C)]
和#[pack]
属性进行注释:第一个禁止可能的字段重新排序,第二个禁用字段对齐的填充。