【发布时间】:2013-07-16 14:55:40
【问题描述】:
我正在研究ASN.1的语法,网上看了很多相关资料:
http://www.itu.int/rec/T-REC-X.690-200811-I/en
http://luca.ntop.org/Teaching/Appunti/asn1.html
http://www.obj-sys.com/asn1tutorial/node11.html
我对 ASN.1 SEQUENCE 类型的编码感到非常困惑。一般来说,我意识到SEQUENCE 基本上是一个聚合——在大多数编程语言中我们称之为对象或实例。它基本上是一个名称/值对列表,类似于 JSON 对象。但与 JSON 对象不同的是,ASN.1 SEQUENCE 具有隐式 SCHEMA,因为它是“类”的实例。
因此,SEQUENCE 的类/模式可能类似于:
{
name UTF8String
age INTEGER
}
并且该架构的 INSTANCE 可能是 SEQUENCE
{
"John Smith"
42
}
但是对于如何在实际的 BER 编码中区分 CLASS 和 INSTANCE ,我感到非常困惑。事实上,我很困惑,我什至不确定 ASN.1 SEQUENCE 应该是类定义还是类的实例。
文档似乎暗示它是一个实例:
8.9序列值的编码
8.9.1应构造序列值的编码。
8.9.2 内容八位字节应由 ASN.1 定义中列出的每种类型的一个数据值的完整编码组成 序列类型的,按照它们在 定义,除非该类型是用关键字 OPTIONAL 引用的 或关键字 DEFAULT。
8.9.3 对于使用关键字 OPTIONAL 或关键字引用的类型,数据值的编码可能但不一定存在 默认。如果存在,它应出现在该点的编码中 对应于 ASN.1 定义中类型的外观。
所以看起来 SEQUENCE 只是一个数据值列表,它必须对应于某个模式(类)。但是 ASN.1 没有 CLASS 类型,那么如何获得实际的类,所以您知道任何给定的 SEQUENCE 是哪个类的实例?
【问题讨论】:
标签: asn.1