2016-10-27 4 views
2

.NETのSystem.DirectoryServices.Protocolsアセンブリでは、軽量のASN.1 BERエンコーダが指定されていますが、ドキュメントは大きくはありません。BerConverterC#BerConverter.Encode()でアプリケーションまたはコンテキスト固有のタグを指定できますか?

エンコードする書式文字列とオブジェクトのリストを指定して呼び出すことができます。

  • INTEGER sがi又はe
  • OCTET STRING sは
  • SEQUENCE sは{}
で符号化することができる o文字で符号化することができる形式の文字で符号化することができます

私は本当にこの単純な変換を利用したいと思います私は別の依存関係をとる必要はありません。依存関係を取ることは望ましくありません。なぜなら、C#はPowershellから呼び出し可能であり、.NETに含まれていないアセンブリを必要としない限り、C#で何か面白いスクリプトを配布することは素晴らしいことです。

しかし、BerConverterはアプリケーションやコンテキスト固有のタグを指定する方法を持たないように思われます。たとえば、構築型のコンポーネントがOPTIONAL

とマークされている場合など、ASN.1のあいまいさを取り除くためによく使用されます

だから、私はエンコードすることができ、以下:

BerConverter.Encode("{i{i}}", 1, 2);

与える:

30 84 00 00 00 0c 02 01 01 30 84 00 00 00 03 02 01 02

しかし、その2番目のシーケンスが[Application 1]または61である必要がある場合は...私はエンコードでそれを放出するフォーマット文字列をどのように置くべきか分かりません。

BerConverterにもこの機能がありますか?

+1

ます逆コンパイラ(例えばILSpy)を使用してBerConverterコードを調べて、それが何であるかを調べることができます。 –

+0

@bosonixコメントをいただきありがとうございます。なぜ私は逆コンパイルを考えなかったのか分かりません。私はJetBrainsのdotPeekを使って 'BerConverter.Encode()'を逆コンパイルしていましたが、カバーの下で 'ber_printf()'が呼び出されていました。それはより良い文書を持っています。以下の回答を参照してください。 – petrsnd

答えて

1

私はなぜこれをやっていないのか分かりませんが、コードを見るために逆コンパイラを使いました。私はBerConverter.Encode()ber_printf()に基づいていることが判明しました。ドキュメントから

文字: 'T'

説明:

タグ。次の引数は、ber_tag_tで、BerElementに書き込まれた次の要素を上書きするタグを指定します。これは通話を介して機能します。

だから、私はに私のコードを変更することができました:私は0x61にタグの値を設定すると、コードが発することができます

BerConverter.Encode("{it{i}}", 1, 0x61, 2)

30 84 00 00 00 0c 02 01 01 61 84 00 00 00 03 02 01 02

関連する問題