你也可以在铁 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]
个属性进行注释:第一个属性不允许可能的字段重新排序,第二个属性不允许字段对齐的填充.