一.ASN.1基本類型
基本類型彙總表
-
類型
UNIVERSALTag
取值
BOOLEAN
1
TRUE,FALSE
NULL
5
NULL
INTEGER
2
整數
ENUMERATED
10
類型定義中列出的成員
REAL
9
實數
BIT STRING
3
比特串
OCTET STRING
4
八位組串,字節流
OBJECTIDENTIFIER
6
RELATIVE-OID
13
1.BOLLEAN類型
BOLLEAN類型只有兩個值:TRUE和FALSE
2.NULL類型
空類型,只有一個值NULL。作爲一種結果,空類型是傳輸報告和響應的典型情況。
Ack ::= NULL
它經常在時間信息中使用,表示傳送時間沒有賦值,如:
Clock ::= CHOICE
{
time UTCTime,
out-of-order NULL
}
當時鍾電池沒有電時,值爲:
battery-down Clock ::= out-of-order:NULL
NULL也可以用在表示鏈表結束的空接點,如:
LinkedList::= SEQUENCE
{
data Data,
next CHOICE{
linked-list LinkedList,
endNULL
}
}
3.INTEGER類型
(1).ASN.1沒有定義整數的範圍,因此必要時需要工確定:
Interval::= INTEGER(0..32767)
(2).ASN.1描述中不能出現“-0”
(3).一些情況下,比如爲了定義錯誤碼,需要給一些數值特定的名字,可以使協議更易於理解,也改善了應用層和編解碼器之間的接口。ASN.1爲INTEGER類型提供了一種特殊語法來解決這個問題。以軟盤驅動器的錯誤碼爲例:
ErrorCode::= INTEGER
{
disk-full(1),
no-disk(-1),
disk-not-formatted(2)
}
stupid-error ErrorCode ::= disk-full
這些名字只能被用於定義ErrorCode類型的值,不能用於其它類型值的定義。命名的整數不需要排序。對於沒有命名的整數,還是可以使用的;已經命名的整數,也可以直接使用數字。
4.ENUMERATED類型
即枚舉類型
例:
ABRT-diagnostic ::=ENUMERATED
{
no-reason-given(1),
protocol-error(2),
authentication-mechanism-name-not-recognized(3),
authentication-mechanism-name-required(4),
authentication-failure(5),
authentication-required(6),
...
}
(1).不能直接使用()中的數字
(2).注意事項:
<1>按照ASN.1的語義模型,任意兩個ENUMERATED類型都是不兼容的。
<2>當一個ENUMERATED類型被IMPORTS到另一個模塊中,則其列表中的標識符也被導入,但只能用於該類型值的賦值。
<3>基本列表(在擴展標識符之前)中的值不需要連續,也不需要排序。
<4>擴展列表(在擴展標識符之後)中的值不需要連續,但需要升序排列。
<5>擴展列表中的值不能和基本列表中的值重複,不論該值是明確指定的,還是缺省計算的。
擴展列表中成員的值必須比該列表中前一個成員的值大。(也就是所謂的升序吧)
表示成員值的必須是數字,不能是標識符。
該類型的UNIVERSALTag值爲10。
(3).使用擴展標記“...”時,需要注意的是,在擴展標記後的成員,其數值必須是升序排列的;和CHOICE、SEQUENCE和SET不同,在使用擴展標記“...”後,增加新成員時,ENUMERATED類型中不需要使用版本標識“[[]]”,並且只能有一個擴展標記。
5.REAL類型
如:piREAL ::= {314159, 10, -5},其中314159是基數,10是E,-5是指數
REAL從語義上等效於:
SEQUENCE
{
mantissaINTEGER (ALL EXCEPT 0),
baseINTEGER (2|10),
exponentINTEGER
}
實數0不能用三元組的方式給出。我們用PLUS-INFINITY和MINUS-INFINITY分別表示“正無窮大”和“負無窮大”,這兩個也不能用三元組表示。此外,我們也要注意到ASN.1中的實數只能以2或者10爲底(base的約束)。
6.BITSTRING類型
按照ASN.1的定義,BITSTRING長度可以爲0。它可以是原始的bit流形式,也可以是布爾向量模型。
(1).比物泫:
numBIT STRING ::=‘00100011’B
(2).布爾向量模型
Rights::= BIT STRING
{
user-read(0),
user-write(1),
group-read(2),
group-write(3),
other-read(4),
other-write(5)
}
group1Rights ::= { group-read, group-write }
當然,也可以之間用碼字來賦值:
group2Rights ::= '0011'B
group2Rights ::= '3'H
group3Rights ::= '001100'B
group1,group2,group3的結果是一樣的,都指具有group-read和group-write權限,最後兩個other權限可以省,而前面的user權限因定位需要不能省。
7.OCTETSTRING類型
與BITSTRING類似,但單位不是比特,而是8位比特
8.OBJECTIDENTIFIER類型
OID是ASN.1規定的一種對象標識符數據類型,用於唯一標識網絡中對象的身份,是網絡領域對象的身份證。通過OID我們就能得到對象的相關信息和屬性。
OID結構是一種樹狀結構(註冊樹),不同層次間用“.”隔開,OID名稱包括字母和數據形式。
例:internet-id OBJECT IDENTIFIER ::=
{iso(1) identified-organization(3) dod(6) internet(1) }
也可以表示爲
internet-id OBJECT IDENTIFIER ::=1.3.6.1
每當一個對象註冊到註冊樹中時,ISO標準ISO9834-1都會對它增加一個相應的文本描述,稱之爲ObjectDescriptor。
9.字符串類型
Multi指字符串中每個字符編碼後所佔字節數是否一樣
字符串類型一覽表
-
類型名字
Tag
字符表
ESC
Multi
NumericString
18
字符“0”到“9”,空格
是
PrintableString
19
字符“A”到“Z”,“a”到“z”,“0”到“9”,空格,單引號(’),圓括號((,)),加號(+),逗號(,),減號(-),點(.),斜槓(/),冒號(:),等號(=),問號(?)
是
VisibleString
ISO646String
26
[ISOReg] entryno. 6; space
是
IA5String
22
[ISOReg] entryno. 1 & 6;
space, delete
是
TeletexString
T61String
20
[ISOReg] entryno. 6, 87, 102,
103, 106, 107,126, 144, 150,
153, 156, 164,165, 168; space, delete
是
VideotexString
21
[ISOReg] entryno. 1, 13, 72,
73, 87, 89, 102,108, 126, 128,
129, 144, 150,153, 164, 165,
168; space,delete
是
GraphicString
25
all the graphicalsets (called
`G') of [ISOReg];space
是
GeneralString
27
all the graphicalsets (called
`G') and all thecontrol characters
(called `C') of[ISOReg];
space, delete
是
UniversalString
28
[ISO10646-1]
是
BMPString
30
the basicmultilingual plane
[ISO10646-1](65,536 cells)
是
UTF8String
12
[ISO10646-1]