在2.5.3节中,给出了一个CHOICE的例子,也提到了“显式地指定子Tag以作区分”。下面我们再看看另外一个例子,并考虑如何将这个例子中的数据编码进行传输。
--定义体重和身高
WhtHht ::= CHOICE {
weight INTENGER, --体重
height INTENGER } –-身高
当我们以INTEGER数据类型标签传送数据的时候,会出现什么问题?无法区分传送的是“体重”还是“身高”,这就需要使用另外的定义机制。
标签类型的定义指的是,通过定义标签区分构造类型中具有相同数据类型(简单或构造类)的不同组件。定义方法有两种:显式(EXPLICIT)和隐式(IMPLICIT),其使用方法如下:
< 新类型名 > ::= [ [标签类名] 标记号 ] [ EXPLICIT | IMPLICIT ] < 原始类型 >
上式中,“标签类名”指的是2.4节中的几种标签类,默认为context-specif?ic即上下文指定类(请理解上下文的含义);“显式|隐式”也为可选项,那是因为默认为IMPLICIT;“原始类型”可以为简单数据类型或构造类型。无论是以显式还是隐式定义新的标签类型,都能够区分构造体中的数据,它们的主要区别在于编码方式上的差异(编码在第5章讲述)。
我们把上面的例子重定义如下(默认的定义方式:上下文指定类,隐式类型):
--定义体重和身高
WhtHht ::= CHOICE {
weight [1] INTENGER, --体重,通过标记号 1 唯一确定
height [2] INTENGER –-身高,通过标记号 2 唯一确定
}