#block #buffer #definition #parser #language #field #def

field_block

缓冲区解析的定义语言

3 个版本 (破坏性更新)

0.3.0 2022年10月2日
0.2.0 2022年10月2日
0.1.4 2022年10月1日
0.1.3 2022年9月30日

9#def

每月下载 22

MIT 许可证

24KB
593

Field Block

缓冲区解析的定义语言。

用法

将此 crate 添加到项目中

cargo add field_block

为缓冲区定义字段

fn get_block() -> Block<Name> {
    let mut block = Block::new();
    block.add_field(
        Name::FixedVarInt, //
        Def::VarInt(U64::Fixed(0xdeadbeef)),
    );
    block.add_field(
        Name::VarInt, //
        Def::VarInt(U64::Var),
    );
    block.add_field(
        Name::BytesFixedLen, //
        Def::Bytes(Len::Fixed(1)),
    );
    block.add_field(
        Name::BytesVarLen, //
        Def::Bytes(Len::Var),
    );
    block.add_field(
        Name::FixedBytes, //
        Def::FixedBytes(vec![0xba, 0xad, 0xf0, 0x0d]),
    );
    block
}

#[derive(Debug, PartialEq, Eq, Hash, Clone)]
enum Name {
    FixedVarInt,
    VarInt,
    BytesFixedLen,
    BytesVarLen,
    FixedBytes,
}

impl FieldName for Name {}

编码缓冲区

let block = get_block();

let mut values = HashMap::new();
values.insert(Name::VarInt, Val::VarInt(0x1234));
let vec = vec![1];
values.insert(Name::BytesFixedLen, Val::Bytes(&vec));
let vec = vec![1, 2, 3];
values.insert(Name::BytesVarLen, Val::Bytes(&vec));

let mut vec = vec![0; 1024];

let end = block.to_bytes(&values, &mut vec).unwrap();

解码缓冲区

let block = get_block();

let vec = vec![0 | 0xc0, 0, 0, 0, 0xde, 0xad, 0xbe, 0xef, 0x12 | 0x40, 0x34, 1, 3, 1, 2, 3, 0xba, 0xad, 0xf0, 0x0d];

let mut values = HashMap::new();

let end = block.to_values(&vec, &mut values).unwrap();

let ValInfo { value, pos } = values.get(&Name::VarInt).unwrap();
let value = value.varint().unwrap();

println!("Field VarInt has a value {} at pos {}", value, pos);

请参阅单元测试示例。

依赖

~38KB