ASN.1编码规则详解(最全最经典)(1) (8)

凌霜傲雪 分享 2020-06-28 下载文档

在协议最高层定义的类型中,不被其它类型引用的那种类型称为PDU(Protocol Data Unit),PDU是应用件交换的数据。 II. 定义一个值(绝对值)

如前所述,这种值不被编码,通常是用作DEFAULT,上下界或者信息对象中的。如:

value-reference TypeReference ::= integer:12

如果两个类型在语法上是完全一样的,则这两种类型的值可以相互赋值。如:

pair Pair ::= {x 5, y 13} couple Couple ::= pair

Couple ::= SEQUENCE { }

x y

INTEGER, INTEGER

Pair ::= SEQUENCE { }

x y

INTEGER, INTEGER

-------------------------------------------------------------------------------------------------------

Lighter-state ::= ENUMERATED {

on(0), off(1), out-of-order(2) }

Kettle-state ::= ENUMERATED {

on(0), off(1), out-of-order(2) }

lighter Lighter-state ::= on kettle Kettle-state ::= lighter

在最后一个例子中,这种类型和值之间的对应,是由称为“ASN.1语义模型”()来负责的。

III. 定义值集合

在语义上,一个值集合相当于一个添加约束后的类型。 如:

总结类型定义、值定义和值集合定义,我们可以得出这样的结论:

Table 2-3 分配语义定义

PrimeNumbers INTEGER ::= {2 | 3 | 5 | 7 | 11 | 13}

第一个词首字母 大写 小写 大写

第二个词首字母 / 大写 大写 ::= ::= ::= ::= 分配内容 类型或者信息对象类 值或者信息对象 值集合或者信息对象集合 2.7.2 本地和外部引用

除本地应用外,ASN.1还支持外部应用,但不推荐使用。如: MyType ::= SET OF OtherModule.Type 最好的方式依然是使用IMPORTS。

2.8 基本类型

Table 2-4 基本类型汇总表

类型 UNIVERSAL Tag 取值 BOOLEAN NULL INTEGER ENUMERATED REAL BIT STRING OCTET STRING OBJECT IDENTIFIER RELATIVE-OID

1 5 2 10 9 3 4 6 TRUE,FALSE NULL 整数 类型定义中列出的成员 实数 比特串 八位组串,字节流 13 2.8.1 BOOLEAN类型

是两个值的集合:TRUE,FALSE。如下:

RoundResult ::= BOOLEAN ok RoundResult ::= TRUE ko RoundResult ::= FALSE 该类型的UNIVERSAL Tag值为1。 2.8.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,

}

当然,可以使用SEQUENCE OF来达到类似目的:

LinkedList ::= SEQUENCE OF Data next CHOICE { }

linked-list end NULL

LinkedList,

{ … }

该类型的UNIVERSAL Tag值为5。 2.8.3 INTEGER类型

整数可以是正整数也可以是负整数,取值范围在协议中没有界定。所以必须由编解码器提前确定好整数的范围,分配必要的内存空间来处理。可以通过在描述中增加一个值声明来判断:

Interval ::= INTEGER(123456789..123456790)

在使用PER编解码规则时,会按照本地整数范围进行截断;相比之下BER编码规则中因为有明确的长度,所以不会出现截断的情况。

虽然在数学可以有“-0”,但在ASN.1描述中不能这样描述。

一些情况下,比如为了定义错误码,需要给一些数值特定的名字,可以使协议更易于理解,也改善了应用层和编解码器之间的接口。这些信息当然可以用注释给出,但是ASN.1编译器不会使用这些信息,在词法分析开始,这些就都被忽略了。ASN.1为INTEGER类型提供了一种特殊语法来解决这个问题。以软盘驱动器的错误码为例:

ErrorCode ::= INTEGER {

disk-full(1), no-disk(-1), disk-not-formatted(2)

}

stupid-error ErrorCode ::= disk-full

这些名字只能被用于定义ErrorCode类型的值,不能用于其它类型值的定义。 命名的整数不需要排序。对于没有命名的整数,还是可以使用的;已经命名的整数,也可以直接使用数字:

ok ErrorCode ::= 0 stupid-error ErrorCode ::= 1

注意:这种命名使用的使花括号,不是约束(使用圆括号)。 这种方式和ENUMERATED类型相比,区别在于: <1>必须指定数值,不能像ENUMERATED中那样缺省;

<2>不能使用扩展标记“…”,当然这实际上不是个问题,和ENUMERATED不同,没有命名的整数还可以使用。

此外,这种方式如果使用不当,会造成混乱,要特别小心。如: alpha INTEGER ::= 1

Type1 ::= INTEGER { alpha(2) }

Type2 ::= INTEGER { alpha(3), beta(alpha) } gamma Type2 ::= beta delta Type2 ::= alpha

实际上gamma的值为1,delta的值为3。

注意:在ASN.1中,INTEGER和REAL类型之间没有兼容性,就是说不能将INTEGER的值赋给一个REAL类型的值。同样的,INTEGER和ENUMERATED类型间也不存在兼容性。

UNIVERSAL的Tag值为2。


ASN.1编码规则详解(最全最经典)(1) (8).doc 将本文的Word文档下载到电脑

下一篇:创建星级供电所PPT汇报框架课件 doc - 图文

相关推荐
相关阅读
本类排行
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 7

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xxxxxx QQ:xxxxxx