ASN.1笔记——基本类型详述(转)
ASN.1笔记——2
一.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]