我的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
AFAIK,内置ASN.1类型中的Mapping数据结构直接等效。
你能使用SET OF
容器类型,它包含代表键值对的双元素SEQUENCE
类型吗?但是,这不会自动保存重复项。您必须确保代码中密钥的唯一性。或者您可能希望查看ASN.1约束,以防您可以使用它们来描述元素的唯一性。
ANY
类型通常用于将类型定义推迟到运行时。因此,接收端可以寻找其他地方(参见ANY DEFINED BY
)并找出ANY
字段中的内容。然后它可以基于刚刚获得的正在处理的字段的结构的知识来解码其内容。当在协议设计时无法知道所有可能的数据类型时(例如,它是可扩展性功能),这非常有用。
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"
这样的事也许......“
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 }
`