本章主要介绍
BER
和
PER
两种编码规则及其衍生规则。
3.3
PER
BER
编码因其在大小上的开销过大而受人诟病,和真实编码数据相比,平均需要增加
50%
的额外数据。正式这个原因推动了
PER
(
Packed Encoding Rules
)的诞生。相同协议,
PER
编码与
BER
相比在大小上至少有
40%
到
60%
的改进。因而在
VoIP
、视频电话、多媒体以及
3G
等需要高速数据传输的领域有广泛应用。
3.3.1
基本规则
PER
编码规则的黄金定律为:“
obtain the most compact encoding using encoding rules as simple as possible
”。
与
BER
中递归使用三元组
TLV<Tag, Length, Value>
不同,
PER
的格式为:
’[P][L][V]’ <optional Preamble, optional Length, optional Value>
,这里
PLV
中每个域都不再是八位组串而是比特串。
因为
Length
可以省略(甚至
Value
也可以省略),那么就不能从编码中得知边界,所以解码器必须知道抽象描述才能正确解码。
PER
编码中没有
Tag
域,因此
PER
不再缺省支持扩展,必须明确在描述中添加扩展符。
只有当长度没有被
SIZE
固定或者数据长度很重要的情况下,才对
Length
进行编码;对
SEQUENCE
或者
SET
类型的值编码时,汇总前面增加个
bitmap
来标识可选成员是否出现;同样,在编码
CHOICE
的被选择成员前,会增加一个序号指示其位置。
和
BER
相比,
PER
使得编解码器处理时间相对要少(但达不到两倍的处理速度),传输速度更快。
3.3.2
四种变形
PER
编码规则可以分为基本的(
Basic
)和规范的(
Canonical
)两类,每一类又可以分为对齐(
Aligned
)和不对齐(
Unaligned
)两种。规范形式的优势在
CER
和
DER
中已经讨论过了,主要用在中继接力系统和安全系统等使用数字签名的场合。在基本形式中,一个抽象值可能有多个
PER
编码。但是,在有限测试后,我们知道基本形式编码器要比规范形式编码器速度更快。
对齐方式下,为了保持八位组对齐,可以增加值为
0
的比特。不对齐方式则编码更为紧凑,但是在编解码时需要花费更多的处理时间。不对齐方式下,不会检查八位组的对齐情况,只在整个数据编码结束后,才进行补位。
注意对齐和不对齐两种方式不能互通,即只能用同种的解码器解码同种编码器编码后的码流。在四种变形中,基本不对齐方式编码是最紧凑的。按照紧凑性降低的顺序,后续依次为:规范不对齐方式,基本对齐方式和规范对齐方式。
在表示层传输上下文协商中,我们需要用
Object Identifier
指明具体采用的是哪种变形。具体值,请参考第二章中
Object Identifier
注册树。
3.3.3
PER
可见子类型约束
为了最大限度的压缩编码,
PER
需要依赖
ASN.1
描述中的子类型约束。约束增加的越具体,
PER
越能得到更优化的编码。而且
PER
会使用到的约束都是经常使用的约束,这样也使得
PER
编译器容易实现。此外,这些约束都是编译器在编译过程中“静态”使用的,不会增加实际编解码过程处理时间。
我们称这类约束为
PER
可见约束(
PER-Visible Constraints
),它们只包含下表所列:
Table 3-3
PER
可见约束
NumericString
、
PrintableString
、
VisibleString
、
ISO646String
、
IA5String
、
UniversalString
、
BMPString
FROM
约束、
SIZE
约束、类型包含约束、约束组合、
SIZE
约束中的扩展
open types
指引用到一个类型域、一个可变类型的值域、或者一个可变类型值集合域。即引用到信息对象类中的类型。
不在上表中的,都不是
PER
可见约束,
PER
编译器也就不做相应优化。
我们考察一个非负数的四种形式的编码,因为自然数常出现在长度域
L
、
bitmap
的大小、
CHOICE
中的序号以及
INTEGER
类型边界中。
对于
INTEGER
类型,
PER
可见约束之一是值域约束。对于有值域约束
(b
min
..b
max
)
的值
n
,如果下边界
b
min
足够大,
PER
编码
n- b
min
的代价就更小。如下:
Figure 3-26
有约束自然数的基本编码规则
I.
有约束数编码
有约束指值域的上、下边界都有限。如果
d=1
,即只有一个值,则收、发双方都知道,那么就没有编码的必要。
在对齐方式下:
∞
l
当
2
≤
d
≤
255
,
n- b
min
的编码占用
log
2
d
个比特。这些比特添加在待发送比特域之后,不进行八位组对齐,不编码
L
;
l
当
d=256
,
n- b
min
的编码占用一个八位组,不编码
L
;
l
当
257
≤
d
≤
65,536
,
n- b
min
的编码占用两个八位组,不编码
L
;
l
当
65,537
≤
d
,
n- b
min
的编码占用
log
256
d
个八位组,并且在前面增加
L
的编码。
在不对齐方式下:
n- b
min
的编码占用
log
2
d
个比特,不编码
L
。
II.
半约束数编码
半约束指值域没有上边界(上边界为
+
∞
)。
n- b
min
的编码占用
log
256
d
个八位组,并且在前面增加
L
的编码。
III.
无约束数编码
无约束指值域没有下边界(即使存在上边界)。
按照
BER
中整数的编码方式编码,并且在前面增加
L
的编码。
IV.
常见小自然数编码
这种情况经常出现在对表征
SEQUENCE
、
SET
类型可选成员的
Bitmap
长度进行编码时;或者
CHOICE
类型序号编码时。这种长度相当小,但是却没有一种限定。
l
当
0
≤
n
≤
63
时,
n
以
6
个比特编码,并且在前面增加一个
0
比特(八位组不对齐):
l
当
64
≤
n
时,
n
以半约束数方式编码,下边界为
0
,并且在前面增加一个
1
比特:
与
BER
中长度域表征编码的八位组数不同,在
PER
的长度域出现下,如果编码为比特串则表征比特位数;如果编码为八位组串(
OCTET STRING
和
open
类型)则表征八位组个数;如果编码为
known-multiplier character string
则表征字符数;如果是
SEQUENCE OF
或者
SET OF
则表征成员个数。
每当
ASN.1
描述中
对类型通过
(SIZE(l
min
..l
max
))
做大小限定时(
l
max
可以是
+
∞
),长度
l
的值要按照
3.3.4
中的规则编码。作为特例,当
l
min
=l
max
≤
65,535
时,长度不需要发送,因为解码器知道该长度。
对齐方式下:
l
当
l
是一个
bitmap
的长度,
l-1
作为常见小自然数编码;
l
当
l
max
≤
65,535
,
l
作为有约束的数编码(约束为
(l
min
..l
max
)
);
l
当
65,535
≤
l
max
,或者
l
max
是无穷大:
-
当
l
≤
127
,
l
以一个八位组编码(八位组对齐),最高比特位为
0
;
-
当
128
≤
l
≤
16,383
,
l
以两个八位组编码(八位组对齐),最高两个比特位为
10
;
-当
16,384
≤
l
,整个编码以
f*16K
为单位分割(
f
取值为
1
,
2
,
3
或者
4
)。除最后的片段外,其余每段,长度都以一个八位组编码,最高两个比特位为
11
。如果编码恰好时
16K
的整倍数,则在最后补充一个全空的八位组;否则最后一个片段按照前两条进行编码。例如占
147,457
个单元的编码可以为:
不对齐方式下:
l
当
l
是一个
bitmap
的长度,
l-1
作为常见小自然数编码;
l
当
l
max
≤
65,535
,
l-l
min
以占用
log
2
(l
min
-l
max
+1)
个比特编码;
l
当
65,534
≤
l
max
-l
min
,或者上边界为无穷大:
-当
l
≤
127
,
l
以八比特编码,最高比特位为
0
;
-
当
128
≤
l
≤
16,383
,
l
以十六比特编码,最高两个比特位为
10
;
-当
16,384
≤
l
,编码方式域对齐类似,但是不是八位组对齐的。
当类型有可扩展的
SIZE
约束,并且待发送值不在该约束扩展的根部分,则长度
l
作为半约束数编码(即
l
min
=0
,
l
max
=+
∞
)。
3.3.6
各类型编码
I.
BOOLEAN
以一个比特编码,
1
为
TRUE
,
0
为
FLASE
。
直接编码,不编码长度,也不做八位组对齐。
II.
NULL
如果
NULL
是作为
CHOICE
的一个选项或者
SEQUENCE
、
SET
可选成员值出现,则已经有
bitmap
能表征。
III.
INTEGER
假设
INTEGER
类型拥有有效的值域范围
(b
min
..b
max
)
,当描述中
INTEGER
类型有至少一个可扩展的
PER
可见约束(
PER-Visible Constraint
),在编码时会在前面增加一个前导(
Preamble
)比特(不考虑八位组是否对齐)。当
INTEGER
类型的值在扩展的根部分,该比特为
0
;否则该比特为
1
。
在编码
n- b
min
过程中,如果需要编码
L
(前面讨论过),则增加长度域
L
的编码。长度
L
的约束为
(1..l
max
)
,其中
l
max
=log
2
b
max
。
如果待发送值
n
属于约束的扩展部分,则长度按照无约束自然数方式编码,如值:
v INTEGER (3..6, ..., 8..10) ::= 8
的对齐方式编码为:
IV.
ENUMERATED
如果该
ENUMERATED
类型不是可扩展的,则先按照数值大小做升序排列,然后以
0
为起点,步长为
1
给每个成员编上序号。对该类型的值编码时,只将序号以值域约束
(0..Index
max
)
编码。如:
v ENUMERATED {orange(56), green(-2), red(2476)} ::= orange
的
PER
编码为“
01
”(因为此时为
Index
max
2
,需要两个比特)。
如果该
ENUMERATED
类型是可扩展的,那么要在编码前增加一个前导(
Preamble
)比特。当值在扩展的根部分时,该比特为
0
;否则该比特为
1
。同时对扩展部分的成员重新进行编号,起点仍为
0
,步长为
1
。编码时对值在根部分的情况,就和该类型是不可扩展时一样;值在扩展部分的情况,对序号按照自然数方式编码。如:
v1 ENUMERATED {orange(56), green(-2), red(2476), …, yellow}
::= orange
的
PER
编码仍然为“
01
”;而
v2 ENUMERATED {orange(56), green(-2), red(2476), …, yellow, purple}
::= yellow
的
PER
编码则为“
1
0
000000
”。
V.
REAL
对值的编码规则和
CER
或者
DER
相同(而且是八位组对齐的),并且在前面增加长度域
L
的编码。这里
L
表征的是八位组数。
VI.
BIT STRING
如果该
BIT STRING
类型有可扩展的
PER
可见大小约束(
PER-Visible Size Constraint
),那么要在编码前增加一个前导(
Preamble
)比特。当值在扩展的根部分时,该比特为
0
;否则该比特为
1
。
对于有大小约束
(SIZE(l
min
..l
max
))
的
BIT STRING
类型:
l
当
l
min
=
l
max
≤
16
比特,不发送长度,直接编码(不是八位组对齐的);
l
当
17
≤
l
min
=
l
max
≤
65,536
比特,不发送长度,直接编码(在八位组对齐方式下是八位组对齐的);
l
当
65,53
7
≤
l
min
=
l
max
,长度按照
3.3.5
中约定编码;而值按照需要进行分段;
l
当
l
min
≠
l
max
(或者没有有效的大小约束),长度按照
3.3.5
中约定编码;而值按照需要进行分段。
如果
BIT STRING
类型包含一个命名位置列表,所有结尾的
0
比特都被去掉;此外,为了满足大小约束,可以增加或者删除结尾
0
比特来达到最小的长度。
VII.
OCTET STRING
与
BIT STRING
规则相同,不过长度域
L
表征的是八位组的个数而不是比特数。
VIII.
OBJECT IDENTIFIER
值的编码规则与
BER
相同,前面需要增加长度域
L
的编码。
IX.
RELATIVE-OID
值的编码规则与
BER
相同,前面需要增加长度域
L
的编码。
X.
字符串与日期
首先描述
known-multiplier
字符串类型,如果这种类型是受约束的,带了一个形如(
SIZE(
l
min
,
l
max
)
)的有效的
size
约束和一个形如(
FROM("
c
1
"|"c
2
"|...|"c
n
")
)的有效的字符约束。如果
FROM
约束是可扩展的,则有效的字符约束就包括了父类型包含的所有的字符。
如果
SIZE
约束是可扩展的,则在
bit-field
上加一个比特。如果串长属于扩展根的范围内,则该比特等于
0
,否则该比特等于
1
。记住,如果
FROM
约束中包含了可扩展的符号,则该约束对于
PER
不可见,即不会改变扩展比特的取值。
PER
压缩
known-multiplier
字符串类是基于有效的字符约束的。假设
n
是有效字符约束中字符的个数,
b
=
[log
2
n],
c =
[log
2
b],
则每个字符在
aligned
变体中被编码成
B
=
2
c
个比特(大于
b
的最小的
2
的次方),而在
unaligned
变体中被编码成
B
=
b
个比特
。
设
v
min
和
v
max
分别是
("
c
1
"|"c
2
"|...|"c
n
")
对应的最小和最大的字符值。
如果
v
max
≤
2
B
-1
,
即所有的系列里的
("
c
1
"|"c
2
"|...|"c
n
")
都可以用
B
个比特来编码,串中的每个字符都可以作为在区间
(
v
min
..
v
max
)
之间的一个整数来编码。这就避免了给字符重新排序赋值。否则,字符序列
("
c
1
"|"c
2
"|...|"c
n
")
按照标准
[ISO646]
或
[ISO10646-1]
中定义的顺序加索引,索引从
0
开始,每次加
1
。这个新的索引号以
B
个比特来编码和发送。
如果字符串的长度是固定的
(
l
min
=
l
max
)
并且小于
64K
,则长度字段
L
就不需要了,在
aligned
变体情况下,只有当
B
×
l
max
≥
17
时才需要
octet - aligned
。
.
如果字符串的长度不固定或者长度虽然固定但大于
64K
,则长度字段按照章节
3.2
编码,然后附着到码流中(在在
aligned
变体情况下,只有当
B
×
l
max
≥
17
时才需
octet - aligned
)。
例如,字符串
v IA5String (FROM ("ACGT")^SIZE(3)) ::= "TAG"
被编码成
11 00 10
。而字符串
v IA5String
::= "TAG"
在
unaligned
变体情况下被编成(注:
IA5String
的
v
min
和
v
max
分别为
0
和
127
):
在
aligned
变体情况下被编成(下面的方框表示从整数个字节开始)
日期类型
GerneralizedTime
和
UTCTime
的编码方式在
basic PER
情况下与
BER
相同,在
canonical PER
情况下与
DER
相同。
对于不属于
known-multiplier
的字符串类型,所有的约束对
PER
都是不可见的。它们的编码方式在
basic PER
情况下与
BER
相同,在
canonical PER
情况下与
DER
相同。长度字段
L
作为一个无约束整数加在前面。
对于
known-multiplier
字符串类型在定义中最小和最大的字符值请参考下表:
Table 3-4
known-multiplier
字符串的最小最大字符值
XI.
Open
类型
一个
open
类型的值实际上是一个任意类型的值,这个类型对于发送方和接收方而言都是已知的。因此这个值就被编成它的有效类型而没有类型的指示。通常情况下,这个值的类型已经在前面发送过了,解码器会存储类型到关联表中,而后在收到
open
类型能够的值后根据关联表就可以查询到对应的类型进行解码。
相应的值编码后,不是整数个字节的情况补充值为
'0'
的比特位以便使该码流为整数个字节(假设为
n
)。并在头部加上长度字段
L
表示字节数
n
,
L
作为无约束整数进行编码。
XII.
SEQUENCE
首先,如果有
COMPONENTS OF
语句,则由相应的类型进行替换。
如果
SEQUENCE
类型是可扩展的,则在编码的头部加上一个比特的
bit-field
,如果
SEQUENCE
的取值中有属于扩展附加部分的成员,则该比特等于
1
,否则等于
0
。
如果
SEQUENCE
的定义中在扩展根部(
extension root
)有
"n"
个成员被置为
OPTIONAL
或
DEFAULT
,则在编码头部再添加
"n"
个比特的
bit-field
,该
bit-field
从第一个
bit
开始,依次指示被标记为
OPTIONAL
或
DEFAULT
的成员是否出现。如果为
1
,则该成员出现,否则没有出现。如果“
n
”小于
64K
,则这个
bit-field
应该直接添到码流中。如果
"n"
大于等于
64K
,
按照前面提到的处理方法把“
n
”个
bit
的
bit-field
分段并添加到域序列中,前面的长度字段
L
就作为一个有约束的整数编码,而约束的上限和下限都等于
n
。
以上为导言(
preamble
)部分,导言之后是各成员类型的编码,依次出现。
在
canonical PER
中,对于标记有
DEFAULT
的成员,如果要编码的值就是缺省值,那么这个成员的编码省略;在
basic PER
中,如果序列中标记为
DEFAULT
的成员是一个简单类型,当它的值为缺省值时,它的编码应省略。而对于结构化的成员
(SEQUENCE, SET, SEQUENCE OF, SET OF, CHOICE)
,即使它的取值是缺省值时,是否被编码是由发送方来决定的。
如果类型是可扩展的但取值中没有出现扩展附加部分,则该
SEQUENCE
的值的编码已经结束。
如果类型是可扩展的并且取值中有
p
个扩展附加部分(双重方括号内的所有成员只当作一个附加扩展部分),则添加一个
p
个比特的
bit-map
,对应的比特取值为
1
则表示该扩展附加部分出现,否则就没有出现。为长度
"
p
"
的
bit-map
增加一个长度指示,编码方式为一个通常的小的非负整数的编码。
以后,依次出现的是各扩展附加部分的编码值
。
扩展附加部分的编码方式如下:
l
如果该扩展附加部分是单个的成员,则作为
open
类型来编码,即包括长度字段和整数个字节的值字段。
l
如果该扩展附加部分是由双重方括号内的所有成员组成的,则该扩展附加部分的值作为
open
类型来编码。与上面不同的是:双重方括号内的所有成员的值被当成一个
SEQUENCE
类型的取值来编码,编码方式参见本节上段。
注意在
SEQUENCE
类型的值没有包括长度字段,因为根据扩展根部的可选成员对应的
bit-map
和扩展附加部分对应的
bit-map
使解码器推断出成员是否存在。
XIII.
SET
SET
类型的扩展根部(
extension root
)的成员是按照
canonical order
来排序的,具体法则如下:
1)
首先按标签类型排序,按照
UNIVERSAL
,
APPLICATION
,
context-specific
,
PRIVATE
四种类型依次排序,
UNIVERSAL
标签类型的元素在最前,
PRIVATE
标签类型的元素在最后;
2)
在标签类型内部,按照标签值的大小排序,小的在前,大的在后。
在排序过程中如果发现某个成员是没有标签的
CHOICE
类型,则该
CHOICE
类型的标签值就会等于其所有选项中标签的最小值。在
CHOICE
类型嵌套的情况下亦是如此。
如果
SET
类型是可扩展的且
SET
类型的值中有扩展附加部分,则扩展附加部分的排序按照其协议定义时的顺序,不做改动(因为在新增扩展附加部分时对应的标签必须符合
canonical order
)。
经过上述的排序后,
SET
类型的编码就按照
SEQUENCE
类型的编码。
XIV.
SEQUENCE OF
显式
PER
限制仅仅对
SEQUENCE OF
类型的成员个数有效。
假设成员数目的上限为
"ub"
,下限为
"lb"
。如果没有上限或者上限值
ub
大于等于
64K
,就认为
ub
不确定;如果没有下限,
"lb"
置为
0
。假设实际的
SEQUENCE OF
的成员数量为“
n
”,编码按如下规则进行:
1)
如果有
size
约束且该约束可扩展,则在码流上添加一个
1
比特的
bit-field
(不需要
octet-aligned
)。
如果元素的个数属于约束的根部则这个比特等于
0
,反之该比特等于
1
。在前一种情况下,调用节
3.2
为生成的编码增加一个半约束数的长度指示,长度值等于
n
。
2)
如果成员值的数目固定且小于
64K
,则没有长度指示,
SEQUENCE OF
的各成员的值的编码依次填充到生成的编码中去。
3)
其它情况,增加长度指示成员值的数目。如果
"ub"
存在,则长度指示作为约束数编码,否则作为半约束数类型的整数编码。
需要注意的是在给每个成员编码时,在
aligned
变体情况下需要
octet-aligned
。
XV.
SET OF
在
basic variant
情况下,把每个
SET
类型的元素按顺序编码即可,而不需要调换顺序。而在
canonical variant
情况下需要先把各
SET
中的元素按
canonical order
进行排序再编码,并在必要的时候需要做一些调整,如加上一些
'0' bit
以形成整数个字节,或加上值为
0
的字节以使短部分和长的部分长度一致。
XVI.
CHOICE
先给
CHOICE
的各个选项标上索引(
index
),过程如下:
1)
对于
CHOICE
类型的根部(
root
)的选项,先按照
canonical order
对各选项进行排序,然后给排序后的选项标上索引,第一个选择项索引为
0
,第二个为
1
,直至根部的最后一个。
如果嵌套了没有标签的
CHOICE
类型,则该类型的标签是其择项中的最小的那个标签。
2)
如果
CHOICE
类型是可扩展的,并且有扩展附加选项,则给扩展附加选项也分别标上索引,第一个扩展附加选项的索引为
0
,第二个为
1
,直至扩展部分的最后一个。(标索引之前不需要对这些选项进行排序,是因为在新增扩展附加选项时对应的标签必须符合
canonical order
)。
在索引标完后,就可以对
CHOICE
类型的值进行编码,过程如下:
1)
如果仅有一个选择项,如果选择了该选择项的话,不要对索引进行编码。
2)
如果
CHOICE
类型是可扩展的,则在码流上加一个比特的
bit-field
(不需要
octet-aligned
)。如果该值属于扩展附加选项,则
该比特等于
1
,否则等于
0
。
3)
如果没有扩展标记,或者有扩展标记但选项在
CHOICE
类型的根部,则选项的索引值就作为一个
INTEGER
来编码(约束为
0..n
,假设
n
为根部的最大索引值),然后是选项的值的编码。
4)
如果有扩展标记且选项是
CHOICE
类型的扩展附加选项,则该索引被当作一个通常的小的非负整数进行编码,其
"lb"
置为
0
。把选项的值当作
open
类型进行编码。
XVII.
Tagged Type
因为
PER
不是隐式支持
Tag
的,所以一个有
Tag
类型的值按照该类型的编码规则进行编码。在
ASN.1
模块内,特定
Tag
上的限制要遵守;建议在模块头的声明中增加
AUTOMATIC TAGS
,这不会影响已有的限制。
XVIII.
EXTERNAL
XIX.
INSTANCE OF
一个
INSTANCE OF
类型的值按照其等效
SEQUENCE
类型值进行编码。
XX.
EMBEDDED PDV
或者
CHARACTER STRING
如果
EMBEDDED PDV
或者
CHARACTER STRING
类型有
WITH COMPONENTS
约束,该约束限制可选项
syntaxes
是两个预定义
object identifier
的序列(即对收、发双方抽象语法、传输语法都明确);或者限制成员
identification
选项为
fixed
,则
PER
编码中嵌入数据作为
OCTET STRING
类型编码。
如果成员
identification
没有按照前面两种方式之一约束,则这两种类型的值需要按照等效的
SEQUENCE
类型值进行编码。
XXI.
Value Set
编码一个有值域
Value Set
约束类型的值时,值域被当作有该值域约束的类型看待。如值域:
Set1 INTEGER(1..20) ::= {1 | 5 | 7}
被等同作:
Set1 ::= INTEGER(1..20)(1|5|7)
XXII.
Information Objects
与
Information Object Sets
信息对象和信息对象集合不编码。传输其中信息的方式,是在类型或者值中引用信息对象或者信息对象集合。编码时,按照所在值的编码规则进行编码。
3.3.7
一个完整例子
还是以
BER
中的例子,来看其对应的
PER
编码。
ASN.1
描述:
MyHTTP DEFINITIONS AUTOMATIC TAGS ::=
BEGIN
GetRequest ::= SEQUENCE
header-only
BOOLEAN,
lock
BOOLEAN,
accept-types
AcceptTypes,
url
Url,
AcceptTypes ::= SET
standards
BIT STRING {html(0), plain-text(1), gif(2),
jpeg(3)} (SIZE (4)) OPTIONAL,
others
SEQUENCE OF VisibleString (SIZE (4))
OPTIONAL
Url ::= VisibleString (FROM ("a".."z"|"A".."Z"|"0".."9"|"./-_~%#"))
v GetRequest ::=
header-only
TRUE,
lock
FALSE,
accept-types
{ standards {html,plain-text} },
url
"www.asn1.com"
相应对齐方式的
PER
编码结果为:
不对齐方式的
PER
编码结果为:
3.4
其它编码规则
3.4.1
LWER
Light Weight Encoding Rules (LWER)
,
1985
年有德国发起,
1988
年由法国继续推进。其目的是为了在
BER
基础上构造处更为轻量级编码规则,随着
PER
的出现和成熟,于
1997
年放弃。
3.4.2
BACnet
BACnet
(
Building Automation and Control Network
)是由美国加热、冷冻、空调工程师协会(
ASHRAE
-
American Society of
Heating, Refrigerating and Air-conditioning Engineers
)设计。用于在
Internet
上传输从分布在各地,监控集中加热、通风、空调或者烟雾报警器的控制设备来的数据。
现在
BACnet
编码规则,结合
ECN
(
X.692, Encoding Control Rule
),使得可以使用一个通用的工具来生成编解码规程。
BACnet
编解码规则具体细节,可以访问网站:
http://www.bacnet.org
ftp://ftp.bacnet.org/Encoding.doc
3.4.3
OER
应用很少,略。
具体信息可以访问:
http://www.viggen.com/ntcip/documents/oer.rtf
3.4.4
SER
SER
(
Signaling specific Encoding Rules
)是由法电研发部(
France Telecom R&D
)和诺基亚(
Nokia
)联合开发的。其主要目的是想通过合适的编译器,为原本不是用
ASN.1
描述的协议,通过重新描述能自动生成编解码器。这类协议主要是在
ASN.1
出现之前就有的,如七号信令的协议,
GSM
接入协议等。
据悉,国内电信设备商
H
,基于同样目的也设计了类似编码规则。但和上述的工作原理有差异。
因专利保护关系,这些规则的详细内容不得而知。
此外,自
1999
年后,
ASN.1
中引入了
XML
。相应的有了
XER
(
XML Encoding Rules
)。