ASN.1 とは何ですか? ウィキペディアはそれが何であるかをほとんど教えてくれると思います。ASN.1 を理解するためには、ASN.1 が 2 つの関心事を分けていることを理解する必要があります: データを記述することと、送信時にデータがどのように見えるかを記述することです。
最初の部分は、データの説明です。ASN.1 は、これを行うために抽象構文表記法 (したがって、ASN.1 という名前) を指定します。たとえば、Coordinate が 0 から 100 の間でなければならない 2 つの整数のシーケンスで構成される複雑な値であることを指定できます。
Coordinate ::= SEQUENCE {x INTEGER(0..100), y INTEGER(0..100) }
次の部分は、送信のためにこれをバイトにエンコードする方法を決定することです。ASN.1 では、これを行うためのエンコード規則の標準セットがいくつか指定されています。さまざまなエンコード規則には、それぞれ独自の利点があります。ほとんどはバイナリですが、1 つはテキストベースです (XER は XML にエンコードされます)。エンコーディング ルールは、上記の抽象的な記述を使用して記述された値を表現する方法をビット レベルで指定します。標準に従っている (そしてエンコーディング規則に同意している) 全員が、まったく同じビット列を取得します。
PER エンコーディング ルールは、抽象定義の制約を使用して、よりコンパクトなエンコーディングを提供します。たとえば、整数の範囲が 0..100 であることがわかっている場合、これらの値をエンコードするのに 7 ビットしか必要ありません。
ASN.1 は、32 ビットの整数または 1 ビットのブール値を定義していません。実際、それは値のバイト表現について考えているため、間違った方法で ASN.1 について考えています。繰り返しになりますが、ASN.1 は、値の説明 (0 から 100 までの整数を使用できます) と値の表現 (その値を 7 ビットで表現できます) を分離します。
参照実装については知りません。1つについて話すことが意味があるかどうかはわかりません。私の会社は、抽象構文定義から C/C++/Java/C# データ構造とコードを生成するツールを販売しています。同様の無料ツールがいくつかあります。私は彼らの品質を知りません。
ASN.1 はシリアル化フレームワークと比べてどうですか? ASN.1 はシリアル化フレームワークではありません。つまり、あらゆる種類のプログラミング データ構造またはオブジェクトを取得してエンコードする方法については何も述べていません。データ値を抽象的に記述する方法を提供し、それらの値のエンコーディングを導出するルールを指定します。一般的な ASN.1 の使用法は、コード ジェネレーターを使用して、選択したエンコーディング規則に従うエンコーディング/デコーディング メソッドと共に、抽象的な記述からプログラミング データ構造を生成することです。もちろん、これを完全に手動で行うこともできます。
ASN.1の利点? ツールを使用してコードを生成する能力。それに加えて、同じ抽象構文からさまざまなエンコーディング (XML、PER など) を生成できる柔軟性があります。
ASN.1 の欠点? おそらく複雑さですが、人はツールを使用して、すべての複雑さを消化する必要なく、多くのことを成し遂げることができると思います (たとえば、エンコーディング ルールの仕様を消化しようとするのではなく、正しいことを行うためにツールに頼る可能性が高いです。 )。
更新: 2 番目のテキストベースのエンコード規則セットが追加されました。JER は JSON にエンコードされます。