ASN.1プロトコルは、シンプルで理解可能な言語でデータ構造を記述します。 たとえば、バージョンフィールド(整数)、メッセージタイプ(列挙)、メッセージ本文(バイナリデータ)を含むメッセージを記述する必要があります。 この説明を取得して、SP.asnファイルに保存します。
SP定義の自動タグ:: = 開始 メッセージ:: = SEQUENCE { バージョンINTEGER DEFAULT 1、 タイプMsgType、 からだ } MsgType :: = ENUMERATED { パブリック(0)、 プライベート(1)、 トラララ(2) } 本文:: =オクテット文字列 終了
ASN.1にはさまざまなプログラミング言語用の有料および無料のコンパイラが多数ありますが、そのうちの1つ、つまり標準のErlang / OTPパッケージのコンパイラに焦点を当てます。 次のようなコマンドを実行してみましょう。
$ erlc SP.asn
コンパイル後、4つのファイルが作成されます。
- SP.erl-Erlangエンコーダー/デコーダーのソースコード
- SP.hrl-記述された個々の構造の記録を含むヘッダーファイル
- SP.beam-BEAMファイル、SP.erlのコンパイル結果
- SP.asn1db-解析されたASN.1ファイルの内部表現を含むファイルは、あるファイルが別の構造をインポートして、インポートされたファイルを再度解析および分析しない場合に使用されます
これで、明確な良心をもって、Erlangインタープリターを開始してメッセージをエンコードできます。
[zert @ pluto]:Habrahabr $ >> erl Erlang R13B01(erts-5.7.2)[ソース] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false] Eshell V5.7.2(^ Gで中止) 1> rr( "SP.hrl")。 ['メッセージ'] 2> {ok、Bin} = 'SP':エンコード( 'Message'、# 'Message' {バージョン= 3、タイプ=プライベート、ボディ= "Hello、ASN.1"})。 {ok、[48,20,128,1,3,129,1,1,130,12,72,101,108,108,111,44,32,65,83,78,46,49]}
ネットワークを介してすでに送信できるバイトのリストを取得し、保存しました
ディスクに書き込み、バイトで実行できる他のアクションを実行します。
コーディングの逆はデコードです。 これはコーディングより複雑ではありません:
3>「SP」:デコード(「メッセージ」、ビン)。 {ok、# 'Message' {バージョン= 3、タイプ=プライベート、 body = "こんにちは、ASN.1"}}
これらは、Erlang / OTPのASN.1コンパイラを使用する最も基本的な方法です。ドキュメントについて読むと、たとえばここで詳細を知ることができます。