私は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.1は"クラス"SEQUENCE
のインスタンスであるため、暗黙の SCHEMA を持ちます。
したがって、 a のクラス/スキーマは次のSEQUENCE
ようになります。
{
name UTF8String
age INTEGER
}
そして、そのスキーマのインスタンスはSEQUENCE
{
"John Smith"
42
}
しかし、実際のBERエンコーディングでCLASSとINSTANCEの違いをどのように見分けることができるかについて、私は完全に混乱しています。実際、私はとても混乱していて、ASN.1SEQUENCE
がクラス定義であるべきなのか、それともクラスのインスタンスであるべきなのかさえわかりません。
ドキュメントは、それがインスタンスであることを暗示しているようです:
8.9シーケンス値のエンコーディング
8.9.1シーケンス値の符号化が構築されなければならない。
8.9.2内容のオクテットは、シーケンス タイプの ASN.1 定義にリストされているタイプのそれぞれからの 1 つのデータ値の完全な符号化で構成されます。キーワード OPTIONAL またはキーワード DEFAULT。
8.9.3データ値のエンコーディングは、キーワード OPTIONAL またはキーワード DEFAULT で参照された型に存在する場合がありますが、存在する必要はありません。存在する場合は、ASN.1 定義のタイプの出現に対応するポイントでエンコーディングに出現するものとします。
したがって、SEQUENCE は単なるデータ値のリストであり、何らかのスキーマ (クラス) に対応している必要があります。しかし、ASN.1 にはCLASS
型がありません。では、どのようにして実際のクラスを取得し、特定の SEQUENCE がどのクラスのインスタンスであるかを知ることができますか?