4个版本 (2个破坏性更新)

0.4.0 2024年5月11日
0.3.0 2024年4月22日
0.2.2 2024年4月16日
0.2.1 2024年4月16日

解析器实现 中排名 1431

MIT 许可证

13KB
88

plod

plod,导出普通旧数据

Plod是一个易于使用的普通旧数据读取器和写入器。它将它们转换成和自然Rust类型。

普通旧数据通常是为C语言设计的,但在Rust中我们可以为相同的表示有更有意义的数据结构。例如,在C语言中,具有单独标签的联合是唯一表示我们称为枚举的东西的方法,这与Rust中的情况类似。

由于它使用标准的ReadWrite特质,Plod可以用于读取和写入二进制文件以及网络协议,只要你有读取器或写入器。

以下是一个使用结构和枚举的示例

use plod::Plod;

#[derive(Plod)]
struct Value {
    kind: u16,
    value: u32,
}

#[derive(Plod)]
#[plod(tag_type(u8))]
enum ValueStore{
    #[plod(tag=1)]
    Series {
        kind: u16,
        #[plod(size_type(u16))]
        values: Vec<u32> },
    #[plod(tag=2,size_type(u16))]
    Keys(Vec<Value>),
}

关于#[plod]属性的更多文档,请参阅Plod

为什么使用plod?

Plod将序列化的普通旧数据转换成可立即使用的Rust数据结构。它使用属性来实现这一点。这意味着枚举或vec可以很容易地从二进制文件中读取。

其他原因

  • Plod基于泛型ReadWrite特质。
  • Plod了解序列化过程中的字节序,它会为您重新排序字节。
  • Plod在读取和写入时不会使用unsafe或transmute
  • Plod不需要您与#[repr()]属性进行交互

Plod适用于普通旧数据,这意味着它非常适合已知、现有的二进制格式。但是

  • 如果您想找到一种方法来序列化自己的数据并在以后能够读取它,您应该选择serde,它可以将任何数据序列化为更多可自描述的格式。

  • 如果您的文件格式不是二进制,并且不易于serde支持,您可以看看nom来解析它。

  • 如果您的数据只包含基本类型,并且您想要的只是速度,您可以考虑plain、pod和nue。

特殊情况

Plod使用与C相同的明显表示法来表示结构体。然而,某些数据结构并不那么明显。

  • enum使用特定的标签在开头表示,每个变体都可以有自己的大小
  • Vec使用它们的大小在开头表示(可以是字节或项目计数)
  • Option不存储,它们被读取为None,其想法是您可以读取一个结构体,然后通过用任何东西替换Options来向其添加更多高级信息。

记录端序及其继承

如何调用Plod特质的函数

示例,教程,首次使用

许可:MIT

依赖关系

~255-700KB
~17K SLoC