当前位置: 代码迷 >> 综合 >> ASN.1笔记——Tag与结构类型
  详细解决方案

ASN.1笔记——Tag与结构类型

热度:46   发布时间:2024-01-21 01:01:02.0

一.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

  相关解决方案