我正在研究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.1SEQUENCE
类型的编码感到非常困惑。一般来说,我意识到 aSEQUENCE
基本上是一个聚合——在大多数编程语言中我们称之为 OBJECT 或 INSTANCE。它基本上是一个名称/值对列表,类似于 JSON 对象。但与 JSON 对象不同的是,ASN.1SEQUENCE
具有隐式 SCHEMA,因为它是"class" 的实例。
因此, a 的类/模式SEQUENCE
可能类似于:
{
name UTF8String
age INTEGER
}
该模式的一个实例可能是SEQUENCE
{
"John Smith"
42
}
但是对于如何在实际的 BER 编码中区分 CLASS 和 INSTANCE ,我感到非常困惑。事实上,我很困惑,我什SEQUENCE
至不确定 ASN.1 应该是类定义还是类的实例。
该文档似乎暗示它是一个实例:
8.9序列值的编码
8.9.1应构造序列值的编码。
8.9.2内容八位字节应由序列类型的 ASN.1 定义中列出的每个类型的一个数据值的完整编码组成,按照它们在定义中出现的顺序,除非该类型被引用关键字 OPTIONAL 或关键字 DEFAULT。
8.9.3对于使用关键字 OPTIONAL 或关键字 DEFAULT 引用的类型,可以但不必存在数据值的编码。如果存在,它应出现在编码中与 ASN.1 定义中类型的外观相对应的点。
所以看起来 SEQUENCE 只是一个数据值列表,它必须对应于某个模式(类)。但是 ASN.1 没有CLASS
类型,那么你如何获得实际的类,所以你知道任何给定的 SEQUENCE 是哪个类的实例?