一.Tag
1.Tag
传输数据时,接收方要明确知道每个收到的数据的类型,我们就要对各类型进行系统性的编号。在ASN.1中使用Tag来唯一标识数据的类型。
(1).分配给每个类型的tag实际上是一个值对:<taggingclass, number>。有四种taggingclass:UNIVERSAL,APPLICATION,context-specific和PRIVATE,分别用00、01、10、11表示。在一个上下文中,如果TaggingClass不同,则相同number的两个Tag也是不同的。
<1>.UNIVERSAL的Tag是ASN.1标准定义的,在描述中不能修改。
<2>.context-specificTag是对SEQUENCE、SET和CHOICE及其成员使用的,可以在描述中自己定义,只要不产生歧义,相同数值可以在不同结构中反复使用。如:
A-possible-type::= SET
{
integer[0] CHOICE
{
a[0] INTEGER,
b[1] INTEGER
},
boolean[1] CHOICE
{
a[0] BOOLEAN,
b[1] BOOLEAN
}
}
SET在ASN.1中定义的Tag值是17,上例的用户定义的类型A-possible-type有两个成员,分别用[0],[1]标识。这两个成员又各自包含两个成员,同样在自已的范围内用[0],[1]。
<3>.APPLICATION和PRIVATE已经不推荐使用。
2.IMPLICIT tagging和EXPLICITtagging
<1>. IMPLICIT
看一个例子:
overseas [1]IMPLICIT SEQUENCE
{
nameUTF8String,
typeOutletType,
locationAddress
},
该类型编码后,Tag[1]会覆盖掉SEQUENCE的默认类Tag[16],具体格式:
oversears是SEQUENCE类型,默认Tag应该是16,这里使用了关键字'IMPLICIT',将其覆盖为1,
CHIOCE类型不能用IMPLICIT模式,例:
warehouse[2] IMPLICIT CHOICE
{
northern[0] NULL,
southern[1] NULL
}
CHIOCE类型在编码时只有一个TLV,即northern或southern中的一个,使用IMPLICIT,[0]或[1]会覆盖掉[2]
在下面的情况中,warehouse