【问题标题】:Application tag in ASN.1 DeclarationASN.1 声明中的应用程序标签
【发布时间】:2014-02-15 20:22:20
【问题描述】:

使用抽象语法表示法声明 IpAddress:

IpAddress ::= [APPLICATION 1] INTEGER (0..4294967295)

[APPLICATION 1] 在这段代码中是什么意思?!

【问题讨论】:

    标签: snmp asn.1 mib


    【解决方案1】:

    注意:这个问题被标记为 SNMP,但这不是 SNMP 的 IpAddress 类型的正确声明。这实际上是一个 Counter32 类型:

    IP 地址 ::= [应用 0] 隐式八位组字符串(大小 (4))

    Counter32 ::= [应用1] 隐式整数 (0..4294967295)

    RFC 2578

    但是;

    ASN.1 类型同时具有符号和在线编码。可以基于内置类型定义新类型。在您的问题中,新类型“IpAddress”被定义为内置“INTEGER”类型的有限范围(0..4294967295)派生,它没有内置范围限制。

    ASN.1 编码由三部分组成:指示数据类型的单字节标记、内容长度和内容(值)本身。如果没有 [括号] 中的部分,新类型的编码将与基本类型相同——在本例中为 INTEGER,其标记值为 0x02(十六进制)。 [APPLICATION 1] 表示该值将使用不同的标记进行编码,以便您可以将其编码与 INTEGER 区分开来。

    [括号]中的这部分由一个标签类和一个数字组成。该类可以是 UNIVERSAL(仅用于内置 ASN.1 类型)、APPLICATION(这意味着特定于应用程序,即 [APPLICATION 1] 到 SNMP 可能意味着与另一个协议中的 [APPLICATION 1] 完全不同的东西)、PRIVATE 用于企业- 特定的,或者可以省略(在这种情况下,它是特定于上下文的)。

    Tag Class 和 Number 本质上是位标志,它们被或在一起以形成编码中的标签值。 APPLICATION = 0x40,因此 [APPLICATION 1] 表示您的问题中定义的值使用 0x41 标记字节编码。

    但是,正如我上面提到的,这实际上会被 SNMP 视为 Counter32 值,而不是 IpAddress。 0x40 将是一个 IpAddress,其内容将被编码为 OCTET STRING 而不是 INTEGER。

    【讨论】:

      【解决方案2】:

      它只是意味着“应用程序范围”。此类类型在 ASN.1 中不可用,但在 SNMP(ASN.1 的应用程序)中可用。

      https://www.rfc-editor.org/rfc/rfc1155

      第 3.2.3 节提供了更多相关信息。

      APPLICATION后面的值最终用于数据编码,用于区分类型。

      您实际上输入了错误,因为IpAddress 应该使用值 0,而不是 1。

      【讨论】:

        猜你喜欢
        • 2011-01-21
        • 1970-01-01
        • 2020-09-01
        • 2018-07-03
        • 1970-01-01
        • 1970-01-01
        • 2017-08-20
        • 2021-01-07
        • 1970-01-01
        相关资源
        最近更新 更多