#xdr #codec #serialization #protocols #pack-unpack #rfc4506

xdr-codec

XDR 编码/解码运行时支持。与 xdrgen 配对使用,xdrgen 可以根据规范生成代码。

23 个版本

使用旧的 Rust 2015

0.4.4 2017 年 8 月 2 日
0.4.3 2017 年 7 月 18 日
0.4.2 2017 年 6 月 20 日
0.4.0 2017 年 3 月 3 日
0.1.7 2015 年 11 月 11 日

#1222 in 编码

Download history 20/week @ 2024-03-04 19/week @ 2024-03-11 26/week @ 2024-03-18 65/week @ 2024-04-01 1747/week @ 2024-04-08 25989/week @ 2024-04-15 26271/week @ 2024-04-22 10461/week @ 2024-04-29 12058/week @ 2024-05-06 13606/week @ 2024-05-13 20629/week @ 2024-05-20 13887/week @ 2024-05-27 13124/week @ 2024-06-03 12846/week @ 2024-06-10 12860/week @ 2024-06-17

54,499 每月下载量
7 包(5 个直接)中使用

MIT/Apache

59KB
1.5K SLoC

Rust XDR 库

Build Status Crates.io Coverage Status

此包提供了一组运行时例程来编码和解码基本的 XDR 类型,可以与 xdrgen 自动生成的代码或手写的编解码器一起使用。

此包还实现了 XDR-RPC 记录标记,形式为 XdrRecordReaderXdrRecordWriter IO 过滤器。

用法

使用此库最简单的方法是与 xdrgen 一起使用,xdrgen 接受一个 .x 文件中的规范,并为您生成所有必要的定义。

但是,您可以手动实现您自己的类型的 PackUnpack 特性

struct MyType {
    a: u32,
    b: Vec<u8>,
}

impl Pack<W> for MyType
    where W: Write
{
    fn pack(&self, out: &mut W) -> xdr_codec::Result<usize> {
        let mut sz = 0;

        sz += try!(self.a.pack(out));
        sz += try!(Opaque::borrowed(self.b).pack(out));

        Ok(sz)
    }
}

impl Unpack<R> for MyType
    where R: Read
{
    fn unpack(input: &mut In) -> Result<(Self, usize)> {
        let mut rsz = 0;
        let ret = MyType {
            a: { let (v, sz) = try!(Unpack::unpack(input)); rsz += sz; v },
            b: { let (v, sz) = try!(Opaque::unpack(input)); rsz += sz; v.into_owned() },
        };

        Ok((ret, rsz))
    }
}

或者,将以下内容放入 src/mytype.x

struct MyType {
    unsigned int a;
    opaque b<>;
}

然后向 Cargo.toml 添加 build.rs

extern crate xdrgen;

fn main() {
    xdrgen::compile("src/mytype.x").expect("xdrgen mytype.x failed");
}

然后将生成的代码包含在您的模块之一中

extern crate xdr_codec;

// ...

include!(concat!(env!("OUT_DIR"), "/mytype_xdr.rs"));

文档

完整的文档在这里:https://docs.rs/xdr-codec/

0.4.2 版本中的更改

实现 char/unsigned char(Rust 中的 i8/u8)的标准特性。

还在 .x 文件中将 short/unsigned short 作为扩展处理。它们仍然以 i32/u32 的形式在内存中表示。

0.4 版本中的更改

版本0.4添加了bytecodec功能,该功能实现了字节类型(i8u8)的PackUnpack。这通常是不可取的,因为当单独使用或在字节数组(opaque是传输紧凑字节数组的首选方式)中使用时,字节会受到大量填充。然而,一些协议错误地指定使用填充的字节数组,因此为这些协议提供了bytecodec

0.2版本中的更改

从0.2版本开始引入了许多破坏性变更

  • u8不再实现Pack/Unpack

    XDR不支持直接编码单个字节;如果支持,则需要将每个字节填充到4个字节。xdr-codec 0.1实现了PackUnpacku8主要是为了允许直接使用Vec<u8>作为XDR opaque<>。然而,这也允许直接使用u8::pack(),这使得意外生成没有适当填充的畸形XDR流变得过于容易。

    在0.2中,u8不再实现PackUnpack。取而代之的是,xdr-codec有一个Opaque<'a>(&'a [u8])包装器来实现这一点。这允许任何[u8]切片都可以进行打包和解包。

    它还提供了一组辅助函数,用于打包和解包灵活和固定大小的opaques、字符串和通用数组。这使得以稳健的方式管理数组变得简单。这也允许xdrgen生成固定大小数组的代码,该代码不是完全展开的解包调用。

    (然而,我对函数的激增并不完全满意,所以我正在考虑一种更符合Rust语法的基于特质的做法。这可能是0.3。)

  • XDR记录标记的扩展

    我添加了XdrRecordReaderIter,它允许遍历记录。以前,流中的所有记录都被扁平化到一个普通的字节流中,这违背了记录的目的。XdrRecordReader仍然实现Read,所以它仍然可用,但它还实现了IntoIterator,因此您可以遍历记录。

    更多单元测试(见下文)指出了一些考虑不周的角落案例,因此现在记录生成和使用EOR标记更为一致。

  • 更多单元测试,包括quickcheck生成的测试

    我增加了测试数量,并添加了quickcheck生成的测试,解决了几个角落案例。

许可证

根据您的选择,许可方式为以下之一

贡献

除非您明确声明,否则您根据Apache-2.0许可证定义的任何有意提交供作品包含的贡献,将按上述方式双许可,不附加任何其他条款或条件。

依赖项

~2.6–4MB
~75K SLoC