如何ASN.1编码地图/字典?

问题描述 投票:3回答:3

我的ASN.1库[1] [2],在Java和Squeak / Pharo中,支持序列,序列和映射序列,以及set,set-of和mapped-set。我希望映射的缺少的集合类型是字典或映射。

是否有任何标准方法将键/值对字典映射到强大的ASN.1编码?是否有链接到这个通用标准和/或映射键/值对的映射/字典的示例?也许可以指出一个未被发现的SO讨论。

我相信我想要一个ANY类型的键/值表示,而不是使用MappedSequence。问题是自我描述,MappedSequence有一组预定义的结构元素,因此在隐式使用键时排序很重要。我想要更多自描述的ANY类型,其中包括无序的键/值对。这有意义吗? ;)

我正在尝试创建一个通用对象映射,排序为ANY类型,但它需要所述通用对象的实例变量的键/值对。我希望使用语言反射,基于与语言类匹配的编码类名,然后生成具有相同结构的ASN.1“ANY”类型,然后我们使用该类型来解码编码对象。在任一语言实现中,我都没有实现强大的ANY类型。

谢谢。

[1] - https://github.com/CallistoHouseLtd/ASN1

[2] - http://www.squeaksource.com/Cryptography/Cryptography-HenryHouse.113.mcz

java smalltalk pharo asn.1 squeak
3个回答
2
投票

AFAIK,内置ASN.1类型中的Mapping数据结构直接等效。

你能使用SET OF容器类型,它包含代表键值对的双元素SEQUENCE类型吗?但是,这不会自动保存重复项。您必须确保代码中密钥的唯一性。或者您可能希望查看ASN.1约束,以防您可以使用它们来描述元素的唯一性。

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


2
投票

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

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-encoded):

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"

1
投票

这样的事也许......“

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 }

`

© www.soinside.com 2019 - 2024. All rights reserved.