这是从二进制文件中读取结构的最自然的方式吗?

Hen*_*nry 3 rust

我刚刚意识到这与使用 Rust 解析二进制协议的最佳方法是什么非常相似

这是使用 Rust 从二进制文件中读取结构的最自然的方式吗?它有效但似乎有点奇怪(为什么我不能只填充结构体?)。

extern crate byteorder;
use byteorder::{ByteOrder, LittleEndian};

struct Record {
    latch: u32,
    total_energy: f32,
    x_cm: f32,
    y_cm: f32,
    x_cos: f32,
    y_cos: f32,
    weight: f32
}

impl Record {
    fn make_from_bytes(buffer: &[u8]) -> Record {
        Record {
            latch: LittleEndian::read_u32(&buffer[0..4]),
            total_energy: LittleEndian::read_f32(&buffer[4..8]),
            x_cm: LittleEndian::read_f32(&buffer[8..12]),
            y_cm: LittleEndian::read_f32(&buffer[12..16]),
            x_cos: LittleEndian::read_f32(&buffer[16..20]),
            y_cos: LittleEndian::read_f32(&buffer[20..24]),
            weight: LittleEndian::read_f32(&buffer[24..28]),
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

ant*_*oyo 5

看看nom箱子:解析二进制数据非常有用。

使用nom,您可以使用以下内容编写解析器(未测试):

named!(record<Record>, chain!
    ( latch: le_u32
    ~ total_energy: le_f32
    ~ x_cm: le_f32
    ~ y_cm: le_f32
    ~ x_cos: le_f32
    ~ y_cos: le_f32
    ~ weight: le_f32
    , {
        Record {
            latch: latch,
            total_energy: total_energy,
            x_cm: x_cm,
            y_cm: y_cm,
            x_cos: x_cos,
            y_cos: y_cos,
            weight: weight,
        }
    }
    )
);
Run Code Online (Sandbox Code Playgroud)

  • @Henry:ByteOrder 是一个处理字节排序的低级 crate(无论是解析还是格式化),而 nom 是一个成熟的解析器生成器 crate :) (3认同)