如何asn.1编码地图 /词典



我的asn.1库[1] [2],在Java和Squeak/pharo中,支持序列,序列和映射的序列,以及设置,集合,集合和集合映射设置。我希望映射的缺少集合类型是字典或映射。

是否有任何标准方法将键/值对词典映射到可靠的ASN.1编码?是否存在映射密钥/值对的地图/词典的常见标准和/或示例的链接?也许没有发现的讨论可以指出。

我相信我想要任何类型的密钥/值表示,而不是使用映射序列。问题是自描述,映射序列具有预定义的结构元素集,因此订购很重要,因为密钥被隐式使用。我想要更多任何类型的自称,其中包括无序的键/值对。这有意义吗?;)

我正在尝试创建一个通用对象映射,有点像任何类型,但是它需要该通用对象的实例变量的键/值对。我希望使用语言反射,基于与语言类匹配的编码类名称,然后生成ASN.1具有相同结构的"任何"类型,然后我们该类型来解码编码的对象。在任何一种语言实施中,我都没有实施的任何类型。

谢谢。

[1] -https://github.com/callistohouseltd/asn1

[2] -http://www.squeaksource.com/cryptography/cryptography-henryhouse.113.mcz

SNMP使用ASN.1编码和键值对,因此这可能是一个很好的起点。RFC 3416将语法定义为ASN.1名为SNMPv2-PDU的模块。

VarBind是键值对:

VarBind ::= SEQUENCE {
        name ObjectName,
        CHOICE {
            value          ObjectSyntax,
            unSpecified    NULL,    -- in retrieval requests 
                                    -- exceptions in responses
            noSuchObject   [0] IMPLICIT NULL,
            noSuchInstance [1] IMPLICIT NULL,
            endOfMibView   [2] IMPLICIT NULL
        }
    }

ObjectName作为键:

ObjectName ::= OBJECT IDENTIFIER

ObjectSyntax作为值:

ObjectSyntax ::= CHOICE {
      simple           SimpleSyntax,
      application-wide ApplicationSyntax }
SimpleSyntax ::= CHOICE {
      integer-value   INTEGER (-2147483648..2147483647),
      string-value    OCTET STRING (SIZE (0..65535)),
      objectID-value  OBJECT IDENTIFIER }
ApplicationSyntax ::= CHOICE {
      ipAddress-value        IpAddress,
      counter-value          Counter32,
      timeticks-value        TimeTicks,
      arbitrary-value        Opaque,
      big-counter-value      Counter64,
      unsigned-integer-value Unsigned32 }

一系列键值对是 VarBindList

VarBindList ::= SEQUENCE (SIZE (0..max-bindings)) OF VarBind

SNMP数据包中VarBindList的示例(ber-编码):

30|36                                  [SEQUENCE]
 30|10                                  [SEQUENCE]
  06|0a|2b 06 01 02 01 02 02 01 04 01    [OID] 1.3.6.1.2.1.2.2.1.4.1
  02|02|05 dc                            [INTEGER] 1500
 30|12                                  [SEQUENCE]
  06|0a|2b 06 01 02 01 02 02 01 05 01    [OID] 1.3.6.1.2.1.2.2.1.5.1
  42|04|05 f5 e1 00                      [Gauge32] 100000000
 30|14                                  [SEQUENCE]
  06|0a|2b 06 01 02 01 02 02 01 06 01    [OID] 1.3.6.1.2.1.2.2.1.6.1
  04|06|53 74 72 69 6e 67                [OCTET STRING] "String"

afaik,内置asn.1类型之间的映射数据结构直接等效。

您可以使用代表键值对的两元素SEQUENCE类型的SET OF容器类型吗?不过,这不会自动从重复项中节省您。您将必须确保代码中键的唯一性。或者,您可能想查看ASN.1约束,以防您可以使用它们来描述元素的独特性。

ANY类型通常用于推迟类型定义,直到运行时。因此,接收端可以看待其他地方(请参阅ANY DEFINED BY),并找出该ANY字段中将发生什么。然后,它可以基于刚刚获得的田间处理结构的知识来解码其内容。当您在协议设计时无法知道所有可能的数据类型时,这通常是有用的(例如,这是可扩展性功能)。

可能...

DeliverMessage ::= SEQUENCE {
    receiverID               INTEGER,
    selector                 UTF8STRING,
    arguments                SEQUENCE-OF ObjectStructure,
    answerID                 INTEGER,
    redirector               ObjectStructure }
ObjectStructure ::= SEQUENCE {
    className                UTF8STRING,
    instanceVariables        SEQUENCE-OF InstanceVariable }
InstanceVariable ::= SEQUENCE {
    instanceVariableName     UTF8STRING,
    value                    ANY }

`

最新更新