古代、コンピューターが大きく、技術者が先見の明で、同じ王国国家のカリノビー橋で、マーケターの精神がビットとターミナルの騎士に知られていなかったとき、これらの勇敢な男たちは集まり、それらを転送するための任意のデータ構造を表現する方法を思いついたネットワークを介して、美しい女性が電話で互いに通信できるようにし、差し迫った問題の解決を妨げないようにします。 これらの部分にはマーケティング担当者がほとんどいなかったため、この方法はエレガントで、エンコード/デコードにほとんどリソースを消費しませんでした。 そして、彼らは彼をASN.1、または要するにX.208と呼びました。
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コンパイラを使用する最も基本的な方法です。ドキュメントについて読むと、たとえば
ここで詳細を知ることができます。