#tlv #ndn #data #networking #named #codec

ndn-tlv

命名数据网络 TLV 值的编码和解码

2 个不稳定版本

0.3.0 2024 年 2 月 26 日
0.2.0 2024 年 2 月 26 日
0.1.0 2024 年 2 月 8 日

#988解析器实现

每月 32 次下载
用于 ndn-protocol

MIT 许可协议

36KB
973

提供用于处理 TLV 编码数据 的抽象

可能作为 TLV 记录一部分出现的数据应实现 TlvEncodeTlvDecode。表示整个 TLV 记录的类型还应实现 [Tlv],除了 TlvEncodeTlvDecode

库的核心是三个特质 [Tlv], TlvEncodeTlvDecode

[Tlv] 应在表示 TLV 记录的类型上实现。换句话说,类型在其编码形式中,以类型和长度开头。

TlvEncodeTlvDecode 用于可以编码/解码并可能出现在 TLV 记录中的类型。所有实现 [Tlv] 的类型也应实现 TlvEncodeTlvDecode

为了简化实现这些特性,提供了一个派生宏 Tlv。只需在枚举上派生它,即可自动实现 TlvEncodeTlvDecode。在结构体上,必须存在一个属性来设置代表该结构体的 TLV 的类型 ID。 [Tlv] 也将应用于结构体。目前不支持在未包含 [Tlv] 的结构体上派生 TlvEncodeTlvDecode

请注意,此库正在积极开发中,API 不可稳定。

示例

以下是一个快速示例,说明如何使用此库

use bytes::{Buf, BufMut, Bytes, BytesMut};
use ndn_tlv::{Tlv, TlvEncode, TlvDecode, Result, VarNum, TlvError};

#[derive(Debug, Tlv, PartialEq)]
#[tlv(8)]
struct GenericNameComponent {
    name: Bytes,
}

#[derive(Debug, Tlv, PartialEq)]
#[tlv(1)]
struct ImplicitSha256DigestComponent {
    name: Bytes,
}

#[derive(Debug, Tlv, PartialEq)]
enum NameComponent {
    GenericNameComponent(GenericNameComponent),
    ImplicitSha256DigestComponent(ImplicitSha256DigestComponent),
}

#[derive(Debug, Tlv, PartialEq)]
#[tlv(7)]
struct Name {
    components: Vec<NameComponent>,
}

fn main() {
    let name = Name {
        components: vec![
            NameComponent::GenericNameComponent(GenericNameComponent {
                name: Bytes::from(&b"hello"[..])
            }),
            NameComponent::GenericNameComponent(GenericNameComponent {
                name: Bytes::from(&b"world"[..])
            }),
        ]
    };

    let data = name.encode();
    assert_eq!(data, &[
            7, 14, 8, 5, b'h', b'e', b'l', b'l', b'o',
                   8, 5, b'w', b'o', b'r', b'l', b'd'
        ][..]);
    let decoded = Name::decode(&mut data.clone()).unwrap();
    assert_eq!(decoded, name);
}

依赖关系

~3.5MB
~69K SLoC