我的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 }
`