※注意! 本内容は独学で得た知識のため、内容に誤りがある場合があります。
予め誤りがある前提でご覧ください。
■PERコーディングとは
PERコーディングとは、極力データサイズを小さくするためにできた符号化規則で「プリアンブル(省略可)・データ長(省略可)・値(省略可)」の3種類で構成されています。
またオクテット列ではなく、ビット列で構成されているため情報が圧縮されてより少ないデータ量で転送が可能になります。
プリアンブルとしては主に「Extensionbit」「OptionalBitmap」「DefaultBitmap」があり、データ長として「DataLength」、値として「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
という結果が返ります。
0 件のコメント:
コメントを投稿