1

私は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 がどのクラスのインスタンスであるかを知ることができますか?

4

2 に答える 2

2

次のように書くとします。

R DEFINITIONS AUTOMATIC TAGS ::=

 BEGIN

 USPostalAddress ::= SEQUENCE {

      street     IA5String,

      city       IA5String,

      state      IA5String (SIZE (2)) (FROM("A".."Z")),

      zipcode    IA5String (SIZE (5)) (FROM("0".."9"))

 }

 END

上記の BEGIN と END の間の部分を「型代入」と呼びます。「USPostalAddress」は、(ユーザー定義の)「タイプ」の名前です。上記の記述により、ユーザー定義型が指定され、それに名前が付けられました。各 SEQUENCE コンストラクト (たとえば、上記の SEQUENCE コンストラクト) は「タイプ」です。これは、それぞれが独自の型を持つ 1 つ以上の「フィールド」を含むという点で、複合型です。上記のタイプの可能な「値」は、次のように示されます。

{ street "1234 Main St.", city "New York", state "NY", zipcode "12345" }

クラスやインスタンスについてではなく、型とその値について話しているだけです。値が 0 から 15 までの整数であるタイプ INTEGER (0..15) を持つことができるのと同じように、値が下位レベルの値の配列である SEQUENCE タイプを持つことができます。上記のシーケンス タイプは、ASN.1 で定義できるデータ構造 (「タイプ」) の非常に単純な例です。

(ASN.1にも「クラス」というものがありますが、全く別物です。)

ASN.1 では、プロトコルのメッセージは通常、最上位の型 (通常は SEQUENCE または CHOICE 型) として指定されます。特定の「メッセージ値」は、最上位タイプの値です。トップレベルの型の値を手に入れたら、標準のエンコード規則 (BER、PER など) の 1 つを使用して、その値をビット ストリームにエンコードできます。BER、PER などでエンコードされた特定の ASN.1 タイプの値であることがわかっているネットワークからビット ストリームを受信すると、それらのビットをデコードして元の値を取得できます。

于 2013-07-18T17:57:07.740 に答える
1

ASN.1 ファイルには通常、次の SEQUENCE 型のような型割り当て (型定義) が含まれています。

myMessage ::= SEQUENCE
{
    a INTEGER(0..100),
    b INTEGER
}

ASN.1 ファイル内のこれらの SEQUENCE 型は、C++/java のクラスまたは C の構造体定義と同じと見なすことができます。

SEQUENCE のインスタンスは、プログラム内でエンコードされた形式 (BER、PER、DER など) またはローカル形式 (オブジェクト/変数) にすることができます。

C コードでそれらを実装する方法の例:

struct myMessage_t          
{
  int a;
  int b;
};

char buffer[1000];   // BER encoded instance will be stored to this buffer
myMessage_t msg;     // this is the local instance

msg.a = 1;
msg.b = 2;

size_t berLen = berEncode_myMessage( &msg, buffer, sizeof(buffer) );

そしてそのためのデコード側:

myMessage_t msg2;            
berDecode_myMessage( buffer, berLen, &msg2 );
assert( msg2.a == 1 );

通常、デコードする前に、エンコードされたインスタンスの最上位タイプが何であるかを知っています。

于 2013-08-01T09:57:53.080 に答える