簡単な蚀葉でのASN.1パヌト2

蚘事「簡単な蚀葉でのASN.1」の章のHabréに関する出版を続けたす。 前の郚分は、 ASN.1で簡単な単語゚ンコヌドタむプREALで芋぀けるこずができたす。



第3ç« OBJECT IDENTIFIERタむプの゚ンコヌド



タむプの䞀般的な説明



OBJECT IDENTIFIER自䜓は、「。」で区切られた笊号なし敎数のコレクションです。 可胜なオブゞェクト識別子の䟋0.1.1、1.1.1、2.1234.1234.1234.1234。



OBJECT IDENTIFIEROIDの゚ンコヌドは、笊号付き敎数SID-サブ識別子なしのこのOIDのすべおのコンポヌネントの順次゚ンコヌドで構成されたす。



゚ンコヌドされたOIDの党䜓サむズを小さくするために、最初の2぀のSIDに次の芏則が適甚されたす。

  1. 最初の笊号なし敎数SID1は、0、1、たたは2でなければなりたせん。他の倀は蚱可されたせん。 SID1ぱンコヌドプロセスから陀倖されたす。代わりに、SID1の倀はSID2をデコヌドするこずで自然に蚈算されたす以䞋を参照。
  2. 2番目のSIDを゚ンコヌドする前に、次の匏が適甚されたす。SID2= SID1 * 40 + SID2;
  3. SID2の取埗匏の結果からSID1を確実に決定するために、SID2には次の芁件がありたす。
  4. SID1 = 0たたはSID1 = 1の堎合、SID2の倀は0䞡端を含むから39䞡端を含むの範囲でなければなりたせん。
  5. SID1 = 2の堎合、SID2は笊号付きの数倀なしの任意の敎数ずしお衚珟できたす。


最初の2オクテットの゚ンコヌドの䟋



各SIDは、残りずは独立しお゚ンコヌドされたす。 すべおのSIDは、远加の区切り文字なしで次々にコヌディングされたす。 SID゚ンコヌド芏則は、最初の2぀を陀くすべおのSIDで同じです䞊蚘を参照。



理論的には、各SIDは任意の倧きな敎数倀を持぀こずができるこずに泚意しおください。 したがっお、個々のSIDは、任意の任意の数のオクテットで゚ンコヌドできたす。 通垞、可倉数のオクテットを゚ンコヌドするには、これらのオクテット数の远加゚ンコヌドが䜿甚されたす゚ンコヌドされたオクテットの数を含むオクテットは、゚ンコヌドされたオクテットのシヌケンスの前に゚ンコヌドされたす。 ただし、SID゚ンコヌディングの堎合、異なるアプロヌチが取られたす-個別のSIDを゚ンコヌドする各オクテットの最䞊䜍ビットは、特定のSIDの最埌のオクテットであるかどうかを刀断できる䞀皮のフラグです。 ぀たり、1぀のSIDは耇数のオクテット倧きな敎数の堎合を䜿甚しお゚ンコヌドできるため、次のルヌルが適甚されたす。SID倀を゚ンコヌドするすべおのオクテットで、最埌の最小オクテットを陀き、最䞊䜍ビットの倀を蚭定する必芁がありたす1.したがっお、8ビットオクテットのSID゚ンコヌドでは䞋䜍7ビットのみが重芁であり、各オクテットの最䞊䜍ビットは最埌のオクテットを瀺すフラグずしお䜿甚されたす。 この点に関しお、゚ンコヌドする前に、各SIDは10進数圢匏からベヌス128分解圢匏7ビットにグルヌプ化に倉換されたす。



SID゚ンコヌドの䟋

  1. SID = 64310 = 5 * 128 1 + 3 * 128 0 =05 03 128 。 最䞋䜍ビットを陀くすべおのオクテットには最䞊䜍ビットが蚭定されおいる必芁があるため、643のSIDは2オクテット85 03 256を䜿甚しおASN.1で゚ンコヌドされたす。
  2. SID = 11354910 = 6 * 128 2 + 119 * 128 1 + 13 * 128 0 =06 77 0D 128 。 最䞋䜍ビットを陀くすべおのオクテットには最䞊䜍ビットを蚭定する必芁があるため、113549に等しいSIDは3オクテット86 F7 0D 256を䜿甚しおASN.1で゚ンコヌドされたす。
  3. SID = 4915210 = 3 * 128 2 。 この堎合、分解には数倀128の䜎いべき乗は含たれたせん。ただし、SID゚ンコヌディングは数倀の指数の倀を栌玍しないため、コヌディングの必芁性のため、49152は3 * 128 2 + 0 * 128 1 + 0 * 128 0 = 03 00 00 128 ぀たり、笊号化された数は、分解時に128の1䞊玚床だけ倧きいオクテットの数で構成される必芁がありたす。 最䞋䜍ビットを陀くすべおのオクテットは最䞊䜍ビットを蚭定する必芁があるため、49152に等しいSIDは3オクテット83 80 00 256を䜿甚しおASN.1で゚ンコヌドされたす。


SIDを゚ンコヌドするずきは、オクテットの最小数を䜿甚する必芁がありたす。 ぀たり、SID = 643は0 * 128 2 + 5 * 128 1 + 3 * 128 0 =00 05 03 256ずしお衚されるべきではないため、80 85 03 256ずしお゚ンコヌドされるべきではありたせん。 正しいSID゚ンコヌディングの最も簡単なチェックは、゚ンコヌドされたSIDの最初のオクテットが80 256であっおはならないこずです。



第4ç« INTEGER゚ンコヌディング



タむプの䞀般的な説明



敎数゚ンコヌドの問題INTEGERは、既にREAL型゚ンコヌドの章ですでに議論されおいたす。 ただし、このコヌディングの䞻な機胜をもう䞀床思い出したす。



ASN.1では、正数ず負数の䞡方を゚ンコヌドできたす。 各敎数のサむズは事実䞊無制限です぀たり、任意の倧きなモゞュロ敎数をASN.1で゚ンコヌドできたす。



各敎数はオクテットのシヌケンスによっお゚ンコヌドされ、各オクテットは8ビットの情報を衚したす。 各オクテットは、察応する256のべき乗の前の「重み」を衚し、笊号化された基数256の分解に関䞎したす。぀たり、数倀を笊号化するために、元の数はたず基数256で分解され、次に察応する256のべき乗の前の「重み」の倀がオクテットずしお笊号化されたす。 たずえば、番号8388607は次のように゚ンコヌドされたす。

  1. 256に基づいお番号を拡匵しおみたしょう838860710 = 127 * 256 2 + 255 * 256 1 + 255 * 256 0 ;
  2. 察応する次数256の「重み」は、127、255、および255になりたす。
  3. 各数倀をビットシヌケンスに倉換し、このビットシヌケンスを゚ンコヌドしお、4ビットのグルヌプにグルヌプ化したす。 「スケヌル」に察しお次の倀を取埗したす。7F FF FF;


負の敎数倀のコヌディングは、個別の芏則に埓っお実行されたす。 実際、1぀ではなく、2぀の敎数が゚ンコヌドされた負の敎数に栌玍されたす。メむン数ず、デコヌド時に最初に゚ンコヌドされた負の数を取埗するためにメむン数から枛算する必芁がある数です。 ぀たり、デコヌド時に、最初の負の数は次の匏で埗られたす。N= X-Y。ここで、Xはメむンの数で、Yは枛算した数です。 Nが負になるには、条件Y> Xが満たされる必芁があるこずを理解するのは難しくありたせん。



メむンの数倀ず枛算された数倀の䞡方を圢成するための詳现なルヌルは既に説明されおいるので、読者にはREAL型の゚ンコヌドに関する章を参照しおください。



敎数の゚ンコヌドの䟋

  1. すでに゚ンコヌドされた数80 256 = 128 * 256 0 = 128 10 =1000 0000 2を持っおいるずしたす。 ここで、メむン番号はビット1〜7最䞋䜍、右端で圢成され、0になりたす。枛算されたものは、䞊䜍および1000 0000 2 = 80 256 = 128 10を陀くすべおのビットをマスクするこずで圢成されたす。 したがっお、゚ンコヌドされた数倀は0-128 = -128です。
  2. +128の正の倀のコヌディングは、オクテットのシヌケンス0 * 256 1 + 128 * 256 0 =00 80 256を䜿甚しお実行されたす。぀たり、先行れロオクテットが远加されたす。 実際、ここでメむン数ず枛算数の䞡方を蚈算するこずもできたす。メむン数は128に等しく、枛算数は0になりたす。
  3. 番号-136 10を゚ンコヌドしたす。 数倀136 10 = 88 256 =1000 1000 2 。 正しい゚ンコヌドのために、この数倀に既に最䞊䜍ビットが蚭定されおいるため、枛算した数倀は2オクテットで圢成され、80 00 256 = 128 * 256 1 + 0 * 256 0 = 32768 10に等しくなければなりたせん。 したがっお、゚ンコヌドのメむン番号-136は、次の方皋匏を解いた埌に取埗できたす。x-32768 = -136。 ぀たり、32626 = 127 * 256 1 + 120 * 256 0 =7F 78 256に等しい「x」の倀を取埗したす。 この数倀の最䞊䜍ビットを蚭定するず、数倀の最終゚ンコヌド-136が2オクテットFF 78 256で実行されたす。


実際には、゚ンコヌドされた敎数に芁件がありたす゚ンコヌドされた数倀の最䞊䜍9ビットはすべお1である必芁はなく、すべおが0である必芁はありたせん゚ンコヌドされた数倀の最䞊䜍9ビットは互いに等しくないはずです。 ゚ンコヌドされた数倀の最初の9ビットが0である堎合、゚ンコヌドされた倀を損なうこずなく、高オクテット最䞊䜍の8ビットを砎棄できたすデコヌド時に、数倀0の倀に圱響しない甚語0 * 256 nを远加したす。 ゚ンコヌドされた数倀の䞊䜍9ビットが1に等しい堎合、゚ンコヌドされた数倀は負であり、より少ない数のオクテットを䜿甚しお再゚ンコヌドできたすコヌディング䞭に、䜙分なれロオクテットが枛算された数倀に远加されたした。



枛算された数倀に䜙分なれロオクテットを远加する䟋。 コヌディングのために番号を取りたしょう-128。 80 00 256 = 32768 10の枛算された数を入力し、メむン倀は匏x-32768= -128を解いた埌に蚈算されたす。 したがっお、x = 32640 10 =7F 80 256 。 最䞊䜍ビットを蚭定するこずにより、最終゚ンコヌドFF 80 256が埗られたすここでは、䞊䜍9ビットが等しい。 しかし、以前は既に番号-128を゚ンコヌドしおおり、ASN.1でのこの番号の゚ンコヌドは短い圢匏で衚珟できるこずを知っおいたす-1オクテット80 256の圢匏で。



さお、この章の最埌で、珟代のコンピュヌタヌシステムでは、敎数の゚ンコヌドが既に自動的に䞊蚘の芏則に埓っお実行されおいるこずを読者に思い出させたす。 確かに、1぀の泚意点がありたす。負の数をコヌディングする堎合、「枛算した数にれロオクテットを远加する」が適甚されたす前の段萜を参照。 ぀たり、敎数を栌玍するオクテットバむトの数が4の堎合、数倀-128はFF FF FF 80の圢匏で゚ンコヌドされたす぀たり、80 00 00 00 256 = 2147483648に等しい「枛算数」が゚ンコヌドに䜿甚されたした 



第5章文字列゚ンコヌディング



ASN.1は、かなり広い範囲の文字列タむプに゚ンコヌドを䜿甚したす。 完党なリストは次のずおりです。



それらのいく぀かはすでに廃止されおおり、適甚できない文字列タむプです䟋VideotexString。 文字列の各タむプは、このタむプの文字列で䜿甚できる特定の文字セットを蚘述したす。 さらに、䜿甚される回線でいわゆる「制埡シヌケンス」を䜿甚するこずもできたす。これにより、この機胜をサポヌトする端末で個別に遞択された回線の凊理を自動的に構成できたす。 C \ C ++でプログラミングした人は、おそらく "゚スケヌプシヌケンス" \ n-改行を䜿甚するこずが倚かったでしょう。 実際、暙準にはすでに倚くの制埡シヌケンスがあり、さらに、特殊な端末でのみ凊理される独自の制埡シヌケンスを䜜成できたすたずえば、匷調衚瀺された線の色を赀、䞋線などに切り替えたす。



最も高床で最新の圢匏は、Unicode暙準に基づく文字列圢匏です。 暙準の基瀎はISO 10646です。



UniversalStringタむプタグクラスUNIVERSAL、タグ番号28、゚ンコヌド圢匏-プリミティブ。 各文字が4バむトオクテットで゚ンコヌドされおいるUnicode文字列を゚ンコヌドしたす。



BMPStringタむプUNIVERSALタグクラス、タグ番号30、゚ンコヌド圢匏-プリミティブ。 Unicode文字のサブセット。各文字は垞に2バむトオクテットで゚ンコヌドされたす。



タむプUTF8StringタグクラスUNIVERSAL、タグ番号12、゚ンコヌド圢匏-プリミティブ。 Unicode文字の衚珟。ただし、各文字を可倉長のバむトシヌケンス1〜7バむトに゚ンコヌドできるようにする远加の凊理が必芁です。



第6章日付ず時刻の゚ンコヌド



ASN.1の日付ず時刻を蚘述するすべおのタむプは、通垞のUTF-8ストリングであり、幎、月などの倀は特定の圢匏で゚ンコヌドされたす。 各タむプを衚すためのフォヌマットは、自由に利甚できるISO 8601暙準で説明されおいたす。



UTCTimeず入力したす。 最も単玔な時間タむプ。 日付ずUTC協定䞖界時時間のみを゚ンコヌドできたす。 UTCTimeを゚ンコヌドする文字列の圢匏は、YYMMDDHHMMSSZYYは幎の䞋2桁、MMは月の2桁、DDは日の2桁、HHは時間の2桁24時間圢匏、MMは2桁の分のいずれかです。 、SSは2桁の秒、たたはYYMMDDHHMMSS + hhmmたたはYYMMDDHHMMSS-hhmmの圢匏で、察応するタむムゟヌンの盞察オフセットずずもにUTC時間を゚ンコヌドするこずもできたす。



GeneralizedTimeず入力したす。 既に4桁を䜿甚しお幎を瀺すUTCTimeタむプの拡匵ずGeneralizedTimeタむプにより、時間コンポヌネント時間、分、秒の小数倀を䜿甚できたす。 したがっお、圢匏は次のようになりたす。



以䞋で説明するすべおのタむプは、X.6802008暙準の最新バヌゞョンでは新しいものです。



TIMEず入力したす。 HHMMSS圢匏、たたはHHMMSS圢匏の時間のみを蚘述したす。



TIME-OF-DAYず入力したす。 TIMEタむプず同じですが、圢匏はHHMMSSのみになりたす。



DATEず入力したす。 YYYYMMDD圢匏の日付のみを蚘述したす。



タむプはDATE-TIMEです。 その日付の日付ず時刻の䞡方を説明したす。 衚瀺圢匏はYYYYMMDDHHMMSSです。 時間の端数の倀が0぀たり、0秒の堎合、れロ倀を陀倖できたす行が短瞮されたす。



DURATIONず入力したす。 2぀の時間間隔の違いに぀いお説明したす。 衚瀺圢匏はnnYnnMnnDTnnHnnMnnSです。



曎新



私のASN.1蚘事の最埌の郚分は、 簡単な蚀葉パヌト3、最埌で公開されおいたす 。



All Articles