※注意! 本内容は独学で得た知識のため、内容に誤りがある場合があります。
予め誤りがある前提でご覧ください。
■ASN.1で良く用いられる型(代表的なもの)
デコードを前提に記載すると、代表的な型はだいたい8種類あります。
■BOOLEAN型
1Bitを使用し、TRUE(1) or FLASE(0)を判定します。
使われ方としてはSEQUENCE型やCHOICE型の中で記載されることが多く、以下のように表現されます。
Data ::= SEQUENCE { trueOrFalse BOOLEAN }
仮に'80'Hのデータが転送されてきたとした場合は
HEX |Bits|Contents |Value|Parameter|Link ----+-----------------------------------|-----+---------+------ 80|1___|trueOrFalse BOOLEAN Data | 1| true| |_000|Padding | | | |0000| | | |
となり、1BitでTRUE or FALSEを判定します。結果
Data trueOrFalse = true
という結果が返ります。
■INTEGER型
整数値を返します。
値範囲が定義される場合(INTEGER(1..8))と定義されない場合(INTEGER(5))があり、値範囲が定義されている場合はINTEGER(a..b)というように表現されます。
この時、値が0の場合はaとなるため、値+aが戻り値となります。
また値が範囲で定義されているので値を表現するためにb-a分のBit数が必要となります。
ex.)INTEGER(1..8)の場合、初期値が0ではなく1なので8('1000'B)を表現する4Bitsではなく、8-1=7('111'B)を表現できる3Bitsが必要となります。
仮に'80'Hのデータが転送されてきたとした場合、ASN.1の情報として
Data ::= SEQUENCE { value Value } Value ::= INTEGER(1..10)
となっていた場合、
HEX |Bits|Contents |Value|Parameter|Link ----+-----------------------------------|-----+---------+------ | |Data SEQUENCE Data | |value |Value 80|100_|Value INTEGER Data | 4| 4+1=5| |___0|Padding | | | |0000| | | |
となり、
Data value = 5
という結果が返ります。
また、
Data ::= SEQUENCE { value INTEGER(1..10) }
という記載や
Data ::= SEQUENCE { value INTEGER(1..maxValue) } maxValue INTEGER ::= 5
という記載がされる場合がありますが、SEQUENCE型の外にINTEGER型を置くかどうか、値の範囲を変数で持つか、の違いであり、結果は全て
Data value = 5
となります。
ちなみに
Data ::= SEQUENCE { value INTEGER(5) }
のように固定値の場合は1Bitも使用せずに
HEX |Bits|Contents |Value|Parameter|Link ----+-----------------------------------|-----+---------+------ | |Data SEQUENCE Data | |value |value | |Value INTEGER Data | | 5| 80|1000|Padding | | | |0000| | | |
となり
Data value = 5
という結果が返ります。
■BIT STRING型
ビット列を返します。
SIZEで表現するBit数を定義しますが、SIZE(a..b)のように可変長の場合はb-a分のDataLengthが必要となります。
仮に'80'Hのデータが転送されてきたとした場合、ASN.1の情報として
Data ::= SEQUENCE { bits BIT STRING(SIZE(3)) }
となっていた場合、
HEX |Bits|Contents |Value|Parameter|Link ----+-----------------------------------|-----+---------+------ | |Data SEQUENCE Data | |bits |bits 80|100_|bits BIT STRING Data | 100| '100'B| |___0|Padding | | | |0000| | | |
となり
Data bits = '100'B
という結果が返ります。
また
Data ::= SEQUENCE { bits BIT STRING(SIZE(1..5)) }
のように可変長で設定された場合は
HEX |Bits|Contents |Value|Parameter|Link ----+-----------------------------------|-----+---------+------ | |Data SEQUENCE Data | |bits |bits 80|100_|bits BIT STRING DataLength | 4| 4+1=5| |___0|bits BIT STRING Data |00000| '00000'B| |0000| | | |
となり
Data bits = '00000'B
という結果が返ります。
■OCTET STRING型
オクテット列を返します。
BIT STRING同様、SIZEで表現するOct数を定義しますが、SIZE(a..b)のように可変長の場合はb-a分のDataLengthが必要となります。
仮に'10 00 00 00'Hのデータが転送されてきたとした場合、ASN.1の情報として
Data ::= SEQUENCE { octets OCTET STRING(SIZE(3)) }
となっていた場合、
HEX |Bits|Contents |Value |Parameter|Link ----+-----------------------------------|------+---------+------ | |Data SEQUENCE Data | |octets |octets 10|0001|octets OCTET STRING Data |010000|'010000'H| |0000| | | | 00|0000| | | | |0000| | | | 00|0000| | | | |0000| | | | 00|0000|Padding | | | |0000| | | |
となり
Data octets = '010000'H
という結果が返ります。
また
Data ::= SEQUENCE { octets OCTET STRING(SIZE(1..10)) }
のように可変長で設定された場合は
HEX |Bits|Contents |Value |Parameter|Link ----+-----------------------------------|------+---------+------ | |Data SEQUENCE Data | |octets |octets 10|0001|octets OCTET STRING DataLength| 0001| 1+1=2| |0000|octets OCTET STRING Data | 0000| '0000'H| 00|0000| | | | |0000| | | | 00|0000| | | | |0000|Padding | | | 00|0000| | | | |0000| | | |
となり
Data octets = '0000'H
という結果が返ります。
■ENUMERATED型
用意された要素の1つを返します。
0が初期値となりますので、要素数-1のBit数が必要となります。
例えば、月を判断するために以下のようなASN.1の情報があり
Data ::= SEQUENCE { months Months } Months ::= ENUMERATED { january, --'Value = 0' february, --'Value = 1' march, --'Value = 2' april, --'Value = 3' may, --'Value = 4' june, --'Value = 5' july, --'Value = 6' august, --'Value = 7' september, --'Value = 8' october, --'Value = 9' november, --'Value = 10' december --'Value = 11' }
そこに'80'Hのデータが転送されて来たとき、
HEX |Bits|Contents |Value|Parameter|Link ----+-----------------------------------|-----+---------+------ | |Data SEQUENCE Data | |months |Months 80|1000|Months ENUMERATED Data | 4|may | |0000|Padding | | |
となり
Data months may
という結果が返ります。
■SEQUENCE型
順番に処理をしていきます。
Extensionbit、OptionalBitmap、DefaultBitmapが無い場合は1Bitも使用しません。
例えば以下のようなASN.1の情報があったとして、
Data ::= SEQUENCE { sex Sex, age Age } Sex ::= ENUMERATED { male, female } Age ::= INTEGER(0..128)
そこに'80 00'Hのデータが転送されて来たとき、
HEX |Bits|Contents |Value|Parameter|Link ----+-----------------------------------|-----+---------+------ | |Data SEQUENCE Data | |sex |Sex 80|1___|Sex ENUMERATED Data | 1|female | | |Data SEQUENCE Data | |age |Age |_000|Age INTEGER Data | 20| 20| |1000| | | | 00|0___| | | | |_000|Padding | | |
となるので
Data sex female age = 20
という結果が返ります。
このように、SEQUENCE型自体は1Bitも使用せずに他の型でBitsを使い結果を返すことになります。
■SEQUENCE OF型
同じ処理(SEQUENCE)を繰り返します。
SIZEで処理回数を定義しますが、SIZE(4)のように固定長である場合はDataLengthは不要ですがSIZE(a..b)のように可変長である場合はb-aのDataLengthが必要になります。
例えば複数人の男女を表現する場合、'80'Hのデータが転送されてきたとき、麻雀のように4人固定である場合は
Majang ::= SEQUENCE(SIZE(4)) OF Sex Sex ::= ENUMERATED { male, female }
とすることで
HEX |Bits|Contents |Value|Parameter|Link ----+-----------------------------------|-----+---------+------ | |Data SEQUENCE OF DataLength | 4| | | |Data SEQUENCE OF Data | |Sex |Sex 80|1___|Sex ENUMERATED Data | 1|female | | |Data SEQUENCE Data | |Sex |Sex |_0__|Sex ENUMERATED Data | 0|male | | |Data SEQUENCE Data | |Sex |Sex |__0_|Sex ENUMERATED Data | 0|male | | |Data SEQUENCE Data | |Sex |Sex |___0|Sex ENUMERATED Data | 0|male | |0000|Padding | | |
となり
Majang Sex female Sex male Sex male Sex male
という結果になります。
しかし家族のように可変の複数人である場合は
Family ::= SEQUENCE(SIZE(1..5)) OF Sex Sex ::= ENUMERATED { male, female }
となるので
HEX |Bits|Contents |Value|Parameter|Link ----+-----------------------------------|-----+---------+------ 80|100_|Data SEQUENCE OF DataLength | 4|4+1=5 | | |Data SEQUENCE Data | |Sex |Sex |___0|Sex ENUMERATED Data | 0|male | | |Data SEQUENCE Data | |Sex |Sex |0___|Sex ENUMERATED Data | 0|male | | |Data SEQUENCE Data | |Sex |Sex |_0__|Sex ENUMERATED Data | 0|male | | |Data SEQUENCE Data | |Sex |Sex |__0_|Sex ENUMERATED Data | 0|male | | |Data SEQUENCE Data | |Sex |Sex |___0|Sex ENUMERATED Data | 0|male |
となり、
Family Sex male Sex male Sex male Sex male Sex male
という結果が返ります。
■CHOICE型
複数の要素から一つを選択し処理します。
ENUMERATED型と同様に0が初期値となりますので、要素数-1のBit数が必要となります。
例えば以下のようなASN.1の情報があったとして、
Legs ::= CHOICE { insect INTEEGR(6), --'Value = 0' octopus INTEGER(8), --'Value = 1' squid INTEGER(10) --'Value = 2' }
そこに'80'Hのデータが転送されて来たとき、
HEX |Bits|Contents |Value|Parameter|Link ----+-----------------------------------|-----+---------+------ 80|10__|Legs CHOICE Data | 2| 2|squid | |squid INTEGER Data | 10| 10| |__00|Padding | | | |0000| | | |
となり
Legs squid = 10
という結果が返ります。
他にもIA5STRINGやSET等、ASN.1の型はいろいろありますので確認してみてください。
■関連ページ
【ASN.1】ASN.1(Abstract Syntax Notation One)とは
【ASN.1】PER(Packed Encoding Rules)コーディングとは
0 件のコメント:
コメントを投稿