2023年1月11日水曜日

【ASN.1】PER(Packed Encoding Rules)コーディングとは

※注意! 本内容は独学で得た知識のため、内容に誤りがある場合があります。
     予め誤りがある前提でご覧ください。 

■PERコーディングとは

PERコーディングとは、極力データサイズを小さくするためにできた符号化規則で「プリアンブル(省略可)・データ長(省略可)・値(省略可)」の3種類で構成されています。

またオクテット列ではなく、ビット列で構成されているため情報が圧縮されてより少ないデータ量で転送が可能になります。

プリアンブルとしては主に「Extensionbit」「OptionalBitmap」「DefaultBitmap」があり、データ長として「DataLength」、値として「Value」となっています。

構成省略可否説明
Extensionbit省略可拡張部(...)があるかどうかを1Bitで判定
OptionalBitmap省略可オプション項目(OPTIONAL)数分のBitsで判定
DefaultBitmap省略可デフォルト項目(DEFAULT)数分のBitsで判定
DataLength省略可データを表すのに必要なBit数を定義。SIZEや要素数で判定
Value省略可表示される情報

・Extensionbit

将来拡張される可能性がある場合があるため、拡張される場合を想定して「...」を付与することで定義される。

この「...」がある場合は最初の1BitをExtensionbitとして追加情報があるかどうか判断される。

例えば'60'Hという情報が転送されてきたとして、ASN.1の情報として

Data ::= SEQUENCE {
	value	Value
}

Value ::= INTEGER(0..15)

である場合は、

HEX |Bits|Contents                      |Value|Parameter|Link
----+-----------------------------------|-----+---------+------
    |    |Data SEQUENCE Data            |     |value    |Value
  60|0110|Value INTEGER Data            |    6|        6|
    |0000|Padding                       |     |         |

となるので

Data
	value = 6

という結果が返ります。

しかし、以下のように

Data ::= SEQUENCE {
	value	Value,
	...
}

Value ::= INTEGER(0..15)

Extensionbit(...)がある場合は、

HEX |Bits|Contents                      |Value|Parameter|Link
----+-----------------------------------|-----+---------+------
  60|0___|Data SEQUENCE Extensionbit    |    0|False    |
    |    |Data SEQUENCE Data            |     |value    |Value
    |_110|Value INTEGER Data            |   12|       12|
    |0___|                              |     |         |
    |_000|Padding                       |     |         |

となるので

Data
	value = 12

という結果が返ります。


・OptionalBitmap

情報において必須項目(Mondatry)とオプション(Optional)の2種類があります。

ASN.1においてもそれは同様でオプション項目には以下のようにOPTIONALが付与され、OptionalBitmapにてオプション項目が有効か無効か判定されます。

例えば'60 24'Hという情報が転送されてきたとして、ASN.1の情報として

Data ::= SEQUENCE {
	value1	Value,           -- Mondatry
	value2	Value OPTIONAL,  -- Optional
	value3	Value OPTIONAL,  -- Optional
	value4	Value OPTIONAL,  -- Optional
}

Value ::= INTEGER(0..15)

である場合は

HEX |Bits|Contents                      |Value|Parameter|Link
----+-----------------------------------|-----+---------+------
  60|011_|Data SEQUENCE OptionalBitmap  |'011'|off,on,on|
    |    |Data SEQUENCE Data            |     |value1   |Value
    |___0|Value INTEGER Data            |    0|        0|
    |000_|                              |     |         |
    |    |Data SEQUENCE Data            |     |value3   |Value
    |___0|Value INTEGER Data            |    1|        1|
  24|001_|                              |     |         |
    |    |Data SEQUENCE Data            |     |value4   |Value
    |___0|Value INTEGER Data            |    2|        2|
    |010_|                              |     |         |
    |___0|Padding                       |     |         |

となるので、

Data
	value1 = 0
	value3 = 1
	value4 = 2

という結果が返ります。


・DefaultBitmap

パラメータとして標準値が決まっている場合、敢えてその値をBitsから取り出さなくてもDEFAULTを付与することで判定用の1bitで標準値を取り出すことが可能になります。

例えば'80'Hという情報が転送されてきたとして、ASN.1の情報として

Data ::= SEQUENCE {
	value	Value
}

Value ::= INTEGER(0..15)

である場合は

HEX |Bits|Contents                      |Value|Parameter|Link
----+-----------------------------------|-----+---------+------
    |    |Data SEQUENCE Data            |     |value    |Value
  80|1000|Value INTEGER Data            |    8|        8|
    |0000|Padding                       |     |         |

となるので、

Data
	value = 8

という結果が返ります。

しかしここで以下のように

Data ::= SEQUENCE {
	value	Value DEFAULT 99
}

Value ::= INTEGER(0..15)

DEFAULTを付与すると

HEX |Bits|Contents                      |Value|Parameter|Link
----+-----------------------------------|-----+---------+------
  80|1___|Data SEQUENCE DefaultBitmap   |  '1'|on       |
    |    |Data SEQUENCE Default Data    |     |       99|
    |_000|Padding                       |     |         |
    |0000|                              |     |         |

となるので、

Data
	value = 99

という結果が返ります。


・DataLength

データ長を定義する場合SIZE(a)のように固定長である場合とSIZE(a..b)のように可変長である場合があります。

SIZE(a)の場合はaを表すことができるBit数を確保すれば良いですがSIZE(a..b)のように可変長である場合はそのサイズを測るBit数の判定が必要となります。

例えば'10'Hという情報が転送されてきたとして、ASN.1の情報として

Value ::= INTEGER(4..19)

である場合は、19-4である15を表すことができる4Bits(’1111’B)が必要になります。

しかしここで重要なのは初期値(Value=0のとき)が4なので、

HEX |Bits|Contents                      |Value|Parameter|Link
----+-----------------------------------|-----+---------+------
  10|0001|Value INTEGER Data            |    1|    1+4=5|
    |0000|Padding                       |     |         |

となります。そうなると値としては

value = 5

という結果が返ります。


↓よろしければクリックをお願いします!

TOPページに戻る


■関連ページ

【ASN.1】ASN.1(Abstract Syntax Notation One)とは

【ASN.1】ASN.1の型とPERのデコード

0 件のコメント:

コメントを投稿