2个稳定版本
1.0.1 | 2020年6月28日 |
---|---|
1.0.0 | 2019年9月13日 |
#1680 in 编码
81KB
1.5K SLoC
rcodec
这个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