gpt4 book ai didi

rust - 用 Rust 解析二进制协议(protocol)的最佳方法是什么

转载 作者:行者123 更新时间:2023-11-29 07:44:46 25 4
gpt4 key购买 nike

基本上我有一个基于 tcp 的网络协议(protocol)来解析。

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

最佳答案

您也可以在 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() call 在技术上是一个函数,所以当我在数组初始化器中使用它时 Rust 会报错。尽管如此,足够大的缓冲区也可以。

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

关于rust - 用 Rust 解析二进制协议(protocol)的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25693824/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com