簡単な蚀葉でのASN.1パヌト3、最終

私は「ASN.1を簡単な蚀葉で」ずいう蚘事を公開し続けおいたす。 Habréに投皿された蚘事の前の郚分は、ここで芋぀けるこずができたす 単玔な単語タむプREALの゚ンコヌドの ASN.1および単玔な単語パヌト2のASN.1 。



第7章ビットの゚ンコヌドシヌケンスビット文字列



ビット文字列を゚ンコヌドする型のカテゎリでは、BIT STRINGずOCTET STRINGの2぀の型を属性付けしたす。



BIT STRINGタむプは、情報の最小ブロックビットのシヌケンスを栌玍するためのものです。 実際、゚ンコヌドは行われたせん。゚ンコヌドされた倀のブロックが、゚ンコヌドされた倀の倀ブロックに配眮されたす。 1぀の䟋倖を陀き、未䜿甚ビットの数は、゚ンコヌドされた倀の最初のオクテットに栌玍されたす。 未䜿甚ビット数の倀は、0〜7の範囲で倉曎できたす。未䜿甚ビットは、ビット列の右端にありたす。 ぀たり、ビット0000 1111 = 0Fのシヌケンスが゚ンコヌドされ、未䜿甚ビットの数が4である堎合、このビット文字列をデコヌドするずきは0000ずしお凊理する必芁がありたす。



BIT STRING型を゚ンコヌドする堎合、基本的な゚ンコヌド方匏ず建蚭的な方匏の䞡方を䜿甚できたす。 ビット文字列を構築する建蚭的な方法を䜿甚するず、1぀のビット文字列を論理的に耇数の小さな文字列に簡単に分割できたす。 建蚭的な方法で゚ンコヌドされたこのようなビット文字列をデコヌドする堎合、すべおのネストされたビット文字列の倀は、1぀の倧きなビット文字列に結合されたす。 倀ブロックでビット文字列を指定する建蚭的な方法を䜿甚する堎合、ビット文字列のみを゚ンコヌドする必芁があり、最埌を陀くすべおのビット郚分文字列では、未䜿甚ビットの倀を持぀オクテットはれロでなければなりたせん。



ビット文字列の建蚭的なコヌディングの䟋を次に瀺したす。 初期ビット文字列に倀0B 0B 0Fが含たれ、未䜿甚ビット数が4であるずしたす。次に、この文字列を3぀のネストされたビット郚分文字列に分割し、建蚭的な圢匏で初期ビット文字列を゚ンコヌドする次のオクテットシヌケンスを取埗したす。



23 0C

03 02 00 0B

03 02 00 0B

03 02 04 0F



ここで、最初の2぀のオクテットは、ビット文字列を゚ンコヌドする建蚭的な圢匏の識別オクテットず、建蚭的な圢匏の倀の党長を瀺しおいたす12。 次に、倀0Bのビット文字列の゚ンコヌドが指定されたす未䜿甚ビットの数はれロです。 次に、倀0Bのビット文字列が再び゚ンコヌドされたすここでも、未䜿甚ビットの数はれロに等しくなければなりたせん。 最埌に゚ンコヌドされたビット文字列は0Fで、未䜿甚ビットの数は4に蚭定されたす。したがっお、連続しお゚ンコヌドされたビット郚分文字列を接続するず、最初に゚ンコヌドされたビット文字列01 01 0が取埗されたす最埌の4ビットは䜿甚されないため、F = 1111は最終倀から切り捚おられたす 。



OCTET STRING型は、単玔なバむトシヌケンスオクテットを栌玍するためのものです。 ぀たり、このタむプの任意のものを゚ンコヌドできたす ぀たり、オペレヌティングシステムファむルのコンテンツでさえ、このタむプで゚ンコヌドできたす。 OCTET STRING型に「長さを明瀺的に指定しない」ASN.1のコヌディングの基本に関する章を参照を䜿甚する堎合は、゚ンコヌドストリヌムの2぀のれロオクテット00 00の出珟を個別に監芖し、远加のネストされたサブストリングを䜜成する必芁がありたすオクテット入力ストリヌムでれロオクテットを分離したす。



第8章プレフィックスタむプの゚ンコヌド



倚くの堎合、次から次ぞず゚ンコヌドされる同じタむプの芁玠を区別する必芁がありたすたずえば、ネストされた芁玠の順序が任意であるSETを゚ンコヌドする堎合。 このため、新しい特定のタグを䜿甚したブロック内の芁玠の远加コヌディングが䜿甚されたす。 たずえば、REALタむプにはUNIVERSALタグクラス00 2 ずタグ番号9がありたす。2぀の連続したREAL倀を論理的に区別するために、远加の「ラッピング」倀゚ンコヌドが䜿甚されたす。 これを行うには、UNIVERSAL00 2 クラス以倖のタグクラスを䜿甚したす。 ぀たり、UNIVERSAL00 2 ずは異なる独特のタグ番号ずタグクラスを持぀新しいタむプを導入し、この新しいタむプの倀ずしお、゚ンコヌドされたREALタむプの暙準ブロック党䜓が゚ンコヌドされたす新しいタむプは別のタむプの゚ンコヌドされた倀をすべお「カプセル化」し、識別オクテットブロックおよび長さブロックずずもに。



たずえば、倀0.15625のREALタむプの゚ンコヌド倀を「ラップ」したすバむナリ圢匏で゚ンコヌドされ、ベヌスは2です。REAL゚ンコヌドの章を参照。 この倀は、5぀のオクテット09 03 80 FB 05で完党に゚ンコヌドされたす。倖郚の「ラッパヌ」には、PRIVATEタグクラス11 2 を䜿甚し、タグ番号は2に蚭定されたす。屋内ナニットの倀はプリミティブタむプではなく、コヌド化された暙準倀ですREALタむプの堎合、倖郚の「ラッパヌ」は建蚭的なコヌディング圢匏になりたす。 したがっお、REALタむプず「ラッパヌ」は、オクテットE2 05 09 03 80 FB 05を䜿甚しお完党に゚ンコヌドされたす。



゚ンコヌド枈み情報の受信者ず送信者の間に事前に合意された既知のASN.1メッセヌゞスキヌムが存圚する堎合、「ラッピング゚ンコヌディング」を䜿甚するずき、内郚「ラップ」倀の情報オクテットの倀を省略できたす。 この堎合、プリミティブタむプは既に「ラッパヌ」の倀ずしお䜿甚され、゚ンコヌドされた倀はC2 03 80 FB 05ずしお蚘述できたすここで、C2はPRIVATEタグクラスの䜿甚の衚瀺+プリミティブ゚ンコヌド圢匏の適甚+タグ番号は2、03は長さです倀ブロック;残りのオクテットは、暙準REAL゚ンコヌディングの倀ブロックから盎接取埗された倀ブロックです。 したがっお、事前に合意されたASN.1スキヌムを䜿甚するず、タグクラスずタグクラス番号の䞡方の遞択された倀を䜿甚しお、共通のASN.1メッセヌゞの遞択された堎所で遞択されたタむプを゚ンコヌドできたすアクションの完党な自由。



結論ずしお、「接頭蟞タむプ」を瀺す衚蚘法に぀いおいく぀か語りたす。 いく぀かの䟋を芋おみたしょう。



タむプ1 :: = [0]ブヌル



これは、タグクラスが「コンテキスト固有」10 2であり、タグ番号が0であり、建蚭的な゚ンコヌド圢匏を持぀Type1に぀いお説明しおいたす。 Type1の倀ブロックでは、暙準のBOOLEAN型の完党に゚ンコヌドされた倀が送信されたす。



Type2 :: = [PRIVATE 2]暗黙のブヌル倀



ここでは、Type2タむプに぀いお説明したす。これには、タグクラス「Private」11 2 、タグ番号2、およびプリミティブ゚ンコヌディング圢匏が含たれたす。 ぀たり、Type2の倀ブロックでは、暙準的に゚ンコヌドされたBOOLEAN型の察応する倀ブロックのみが送信されたす識別ブロックず長さブロックはType2から取埗されたす。



぀たり、ASN.1のデフォルトでは、「コンテキスト固有」10 2がタグクラスずしお䜿甚され、建蚭的なコヌディング圢匏も䜿甚されたす。 ぀たり、最初の䟋は同等の圢匏で蚘述できたすただし、ASN.1タむプを蚘述するファむルにそのようなレコヌドを盎接含めるこずはできたせん。



タむプ1 :: = [コンテキスト0]明瀺的なブヌル倀



ちなみに、正匏には暙準型に完党に盞圓するもの、たずえばBOOLEANは、次のように蚘述できたす。



BOOLEAN_Eq :: = [ナニバヌサル1]暗黙のブヌル



IMPLICIT衚蚘法が、SEQUENCE型などの最初の構成型に適甚されるず、別の興味深い状況が発生したす。 この堎合、新しいタむプにも建蚭的な圢匏があり、新しいタむプの倀ブロックは、゚ンコヌドされたタむプSEQUENCEの倀ブロックから取埗されたす。 したがっお、IMPLICIT衚蚘の堎合、次のルヌルを定矩できたす。

  1. 新しいタむプの倀ブロックは、垞に゚ンコヌドされたタむプの倀ブロックから取埗されたす。
  2. 建蚭的たたはプリミティブ゚ンコヌディングの䜿甚は、゚ンコヌドされるタむプによっお異なりたす。新しいタむプの゚ンコヌディングのタむプは、゚ンコヌドされるタむプで䜿甚される゚ンコヌディングのタむプず同等です。


たずえば、次の衚蚘では、IMPLICITを䜿甚しおいるにもかかわらず、PrimTypeタむプは建蚭的なタむプになりたす。



ConstType :: = [0] REAL

PrimType :: = [PRIVATE 2]暗黙的なConstType



結論ずしお、CHONタむプでは、ASN.1コヌディング芏則に埓っお、EXPLICIT構造的コヌディング衚蚘法を垞に適甚する必芁があるず蚀いたす。



第9ç« SEQUENCEタむプの゚ンコヌド



SEQUENCEタむプは、さたざたなタむプの゚ンコヌドされた倀の論理的なグルヌプ化結合に䜿甚されたす。 実際、SEQUENCEずいう名前翻蚳では「シヌケンス」は、このタむプのスコヌプを瀺しおいたす。 シヌケンス内のタむプのシヌケンスは事前定矩されおおり、倉曎できたせん。

このタむプのコヌディングは「構成的」です。぀たり、゚ンコヌドされた倀を持぀ブロックには、個々の倀を゚ンコヌドする远加のサブブロックが含たれたす。 より詳现な説明に぀いおは、この蚘事の第1章の詳现な説明を参照しおください。



タむプSEQUENCEの゚ンコヌドの䟋。 2぀の数倀をシヌケンスで゚ンコヌドする必芁があるず仮定したす。1぀の敎数INTEGER、-128、および1぀の浮動小数点数REAL、0.15625ベヌス2分解で衚瀺です。 関連する前の章から、敎数はオクテットのシヌケンス02 01 80ずしお゚ンコヌドされ、浮動小数点数はオクテットのシヌケンス09 03 80 FB 05ずしお゚ンコヌドされおいるこずがわかりたす。 次に、これら2぀の゚ンコヌドされた数倀を含むSEQUENCEタむプは、次のように゚ンコヌドされたす。



30 08 02 01 80 09 03 80 FB 05



ここで、最初のオクテットは識別オクテットであり、タむプSEQUENCEの倀が゚ンコヌドされ、建蚭的な゚ンコヌド方匏が䜿甚されるこずを通知したす。 2番目のオクテットには、タむプSEQUENCEの倀が゚ンコヌドされるオクテットの数が栌玍されたす。 次の3オクテットぱンコヌドされた敎数倀-128を衚し、最埌の5オクテットぱンコヌドされた浮動小数点倀0.15625を衚したす。



第10章タむプSETの゚ンコヌド



SETタむプの゚ンコヌドは、実際にはSEQUENCEタむプの゚ンコヌドず完党に䞀臎しおいたすが、SETで゚ンコヌドされたタむプのシヌケンスを倉曎できる点が異なりたす。 ぀たり、たずえば、SEQUENCE型に関する章から数倀を取埗した堎合、実際には、SET型に察しおそれらを゚ンコヌドするための2぀の可胜な完党に同等のオプションが埗られたす。



オプション131 08 02 01 80 09 03 80 FB 05

オプション230 08 09 03 80 FB 05 02 01 80



2番目のオプションは、゚ンコヌドされた敎数を゚ンコヌドされた浮動小数点数の埌に眮くだけです。



SETタむプでは、同じタむプを持぀2぀たたはそれ以䞊の倀も゚ンコヌドできたす。 デコヌドするずき、倀は「プレフィックスタむプ」を䜿甚しお区別されたす。 これらに぀いおは、第8章ですでに説明しおいたす。



第11章ブヌル型の゚ンコヌド



BOOLEAN型は、TRUEtrueたたはFALSEfalseの2぀の倀のみを゚ンコヌドできたす。 倀がFALSEの堎合、倀ブロックには00に等しいオクテットが1぀だけあるはずです。倀がTRUEの堎合、倀ブロックには倀がれロ以倖のオクテットが1぀だけあるはずです。 ぀たり、BOOLEAN型の次の2぀のTRUE゚ンコヌドオプションは同等です。



オプション101 01 01

オプション201 01 FF



第12ç« NULL゚ンコヌディング



NULL倀は垞に䞀定であり、垞に2぀の00 00オクテットで゚ンコヌドされたす。最初のオクテットは情報オクテットであり、2番目のオクテットは垞に長さがれロの長さオクテットです。



Habrの結論



PDF圢匏のフルテキストおよびPDFに添付されおいる远加の䟋は、 盎接リンクからダりンロヌドできたす。 最新バヌゞョンのAcrobat Readerを䜿甚しお衚瀺するこずをお勧めしたす。



All Articles