#binary-data #data-encoding #codec #combinator #functional #plausible

rcodec

提供纯函数式、声明式编码和解码二进制数据的功能组合器

2个稳定版本

1.0.1 2020年6月28日
1.0.0 2019年9月13日

#1680 in 编码

MIT 许可证

81KB
1.5K SLoC

rcodec

Build Status Crates.io Docs.rs MIT licensed

这个Rust库提供纯函数式、声明式编码和解码二进制数据的功能组合器。其设计主要源自Scala库scodec

用法

将以下依赖项添加到您的 Cargo.toml

[dependencies]
pl-hlist = "1.0"
rcodec = "1.0"

然后,在您的crate中

use pl_hlist::*;
use rcodec::byte_vector;
use rcodec::codec::*;

示例

编解码器模块提供了一些预定义的编解码器。在以下示例中,我们使用 uint32 编解码器将一个 u32 值编码为 ByteVector 表示形式,然后将 ByteVector 解码回其 u32 表示形式

let codec = uint32;
let v0 = 258u32;
let bv = codec.encode(v0).unwrap();
assert_eq(bv, byte_vector!(0x00, 0x00, 0x01, 0x02));
let v1 = codec.decode(bv).unwrap().value;
assert_eq(v0, v1);

通过 pl-hlist crate 支持编码/解码时自动绑定到结构体

#[derive(Debug, PartialEq, Eq, Clone, HListSupport)]
struct TestStruct {
    foo: u8,
    bar: u16
}

let codec = struct_codec!(TestStruct from {uint8} :: {uint16});
let s0 = TestStruct { foo: 7u8, bar: 3u16 };
let bv = codec.encode(&s0).unwrap();
assert_eq(bv, byte_vector!(7, 0, 3));
let s1 = codec.decode(&bv).unwrap().value;
assert_eq(s0, s1);

以下是一个更复杂的编解码器示例,用于虚构的二进制数据包格式,它使用了许多内置的组合器

#[derive(Debug, PartialEq, Eq, Clone, HListSupport)]
struct PacketHeader {
    version: u8,
    port: u16,
    checksum: u16,
    data_len: u16
}

#[derive(Debug, PartialEq, Eq, Clone, HListSupport)]
struct Packet {
    header: PacketHeader,
    flags: u64,
    data: Vec<u8>
}

let magic = byte_vector!(0xCA, 0xFE, 0xCA, 0xFE);

let header_codec = struct_codec!(
    PacketHeader from
    { "version"      => uint8  } ::
    { "port"         => uint16 } ::
    { "checksum"     => uint16 } ::
    { "data_len"     => uint16 }
);

let packet_codec = struct_codec!(
    Packet from
    { "magic"           => constant(&magic) } >>
    { "padding"         => ignore(4)        } >>
    { "header"          => header_codec     } >>= |hdr| {
        hcodec!(
            { "flags"    => uint64                                       } ::
            { "data"     => eager(bytes((hdr.data_len - 8u16) as usize)) })
    }
);

更多特定编解码器的示例可以在 src/codec.rs 的测试以及 tests/lib.rs 中找到。

许可证

rcodec 在MIT许可证下分发。有关更多详细信息,请参阅LICENSE。

依赖项

~1.5MB
~38K SLoC