信息技术 ASN.1编码规则
第1部分:基本编码规则(BER)、
正则编码规则(CER)和
非典型编码规则(DER)规范
1 范围
本部分规定了基本编码规则集合,它们可以用来派生使用GB/T 16262.1、GB/T 16262.2、
GB/T 16262.3和GB/T16262.4规定的记法定义的类型值的传送语法规范,上述这些标准统称为抽象语法记法一或ASN.1。这些基本编码规则也适用于解码这种传送语法,以标识被传送的数据值。该集合还规定了正则编码规则和非典型编码规则集合,它把值的编码局限于只是基本编码规则所提供的替换编码之一。
2规范性引用文件
下列文件中的条款通过GB/T 16263的本部分的引用而成为本部分的条款。凡是注日期的引用文件,其随后所有的修改单(不包括勘误的内容)或修订版均不适用于本部分,然而,鼓励根据本部分达成协议的各方研究是否可使用这些文件的最新版本。凡是不注日期的引用文件,其最新版本适用于本部分。
GB/T 1988--1998 信息技术 信息交换用七位编码字符集(eqv ISO/IEC 646:1991)
GB/T 2311---2000 信息技术 字符代码结构和扩充技术(idt ISO/IEC 2022,1994)
GB/T 5261--1994信息技术七位和八位编码字符集的控制功能(eqv ISO/IEC 6429,1992)
GB/T 9387.1--1998信息技术开放系统互连基本参考模型 第1部分:基本模型(idt ISO/IEC 7498-I,1994)
GB/T 12054--1989数据处理转义序列登记规程(neq IS0 2375,1985)
GB 13000.1--1993 信息技术通用多八位编码字符集(UCS)第1部分:体系结构与基本多文种平面(idt ISO/IEC 10646.1:2000)
GB/T 16262.1--2006 信息技术 抽象语法记法一(ASN.1) 第1部分:基本记法规范(ISO/IEC 8824-1:2002, IDT)
GB/T 16262.2--2006信息技术 抽象语法记法一(ASN.1) 第2部分:信息客体规范(ISO/IEC 8824-2,2002,IDT)
GB/T 16262.3--2006信息技术 抽象语法记法一(ASN.1) 第3部分:限制规范(ISO/IEC8824-3, 2002, IDT)
GB/T 16262.4--2006信息技术 抽象语法记法一(ASN.1) 第4部分:参数化ASN.1规范(ISO/IEC 8824-4, 2002, IDT)
SJ/Z 9047--1987信息处理信息交换用字符串形式表示数值的方法(idt IS0 6093,1985)
要与转义序列一起使用的编码字符集的ISO国际登记簿
3术语和定义
GB/T 9387.1和GB/T 16262.1中的术语和定义以及下列术语和定义适用于本部分。
3.1
正则编码canonical encoding
通过应用无实现相关选项的编码规则所得到的抽象值的完整编码。这种规则导致在抽象语法中无歧义和唯一的编码与值之间一对一映射的定义。
3.2
结构化编码 constructed encoding
数据值编码,其中,内容八位位组是一个或多个数据值的完整编码。
3.3
内容八位位组contents octets
表示特定值的数据值编码的那部分,以便把该特定值与同类型中的其他值区分开。
3.4
数据值data value
按某个类型值所规定的信息;类型和值用ASN.1定义。
3.5
动态一致性 dynamic conformance
在通信场合中,某一实现遵守预定行为的要求的声明。
3.6
(数据值的)编码 encoding (of a data value)
用来表示数据值的八位位组的完整序列。
3.7
内容结束八位位组 end-of-contents octets
在其末端出现的数据值编码的一部分,它用来确定编码的终止。
注:不是所有编码都需要内容结束八位位组。
3.8
标识符八位位组 identifier octets
数据值编码的一部分,它用来标识值的类型。
注:某些ITU-T建议把术语“数据元素”用于本八位位组序列,但在本部分中不使用该术语,而其他标准中使用该术语意指二数据值”.
3.9
长度八位位组length octets
数据值编码的一部分,它紧跟在标识符八位位组的后画,用来确定编码的终止。
3.10
原始编码primitive encoding
数据值的编码,其中,内容八位位组直接表示该值。
3.11
接收器receiver-
对发送器所产生的八位位组进行解码的一种实现,以便标识出曾编码的数据值。
3.12
发送器 sender
对传送数据值进行编码的一种实现。
3.13
静态一致性 static conformance
对已定义的特性中一组有效特性的某一实现所支持的要求的声明。
3.14
尾0位trailing o bit
位串值中最后位置内的0。
注:由单个O位组成的位串值中的D就是尾O位。移去它将产生一个空的位申。
4缩略语
下列缩略语适用于本部分。
ASN.1 抽象语法记法一
BER ASN.1的基本编码规则
CER ASN.1的正则编码规则
DER ASN.1的非典型编码规则
ULA 高层体系结构
5记法
本部分引用GB/T 16262.1定义的记法.
6约定
6.1本部分使用术语“最高有效位”和“最低有效位”来规定编码中每个八位位组的值。
注;低层规范使用相同记法来定义串行线路中位传输的次序,或者把这些位赋给并行信道。
6.2仅为本部分的目的,八位位组中的位编号从8至1,位8为“最高有效位”.位1为“最低有效位”。
6.3为本部分的目的,两个八位位组串可以进行比较。如果这两个八位位组串的长度相同,并且在每个八位位组位置上的长度相同,则一个八位位组串等于另一个。当且仅当:
a)S1和S2在每个位置内具有相同的八位位组,直到并且包括S2内的最后1个八位位组.但S1较长;或者
.则一个八位位组串S1大于另一个S2。7一致性
7.1 动态一致性在第8章至第12章中规定。
7.2静态一致性由那些规定了应用一个或多个编码规则的标准来规定。
7.3基本编码规则允许替换的编码作为发送器的一个选项,声称符合基本编码规则的接收器应支持所有替换的编码。
8. 1.3.2 b)和表3中。7.4正则编码规则或非典型编码规则不允许替换的编码。
8基本编码结构
8.1 编码的一般规则
8.1.1编码结构
8.1.1.1 数据值的编码应由下列次序的4种成分组成;
a)标识符八位位组(见8.1.2);
b)长度八位位组(见8.1.3);
c) 内容八位位组(见8.1.4),
d)内容结束八位位组(见8.1.5)。
8.1.1.2除非长度八位位组的值需要出现内容结束八位位组,否则该内容结束八位位组不应出现(见8.1.3)。
8.1.1.3
图1示出了编码的结构(原始编码或结构化编码),图2示出了替换的结构化编码。
标识符八位位组 |
长度八位位组 |
内存八位位组 |
内容八位位组中的八位位组数
(见8-1.3.2)
图1 编码结构
l 标识符八位位组 |
长度八位位组 |
内容八位位组 |
内容结柬八位位组 |
指示内容八位位组由
内容结柬八位位组终止
(见8.1.3.6)
指示内存八位位组没有
任何进一步的编码
图2替换的结构化编码
8.1.1.4本部分中规定的编码既不受ASN.1子类型记法的影响,也不受ASN.1类型的可扩充性记法的影响。
注:这意味着当确定编码时,所有约束记法可不予理睬。对于把扩充处理为好像它们曾处于类型的扩充根内的情况,也意味着CHOICE、SEQUENCE和SET中的所有可扩充性标记可不予理睬.
8.1.2标识符八位位组
8.1.2.1标识符八位位组应对数据值类型的ASN.1标签(类和编号)进行编码。
8,1.2.2对于编号范围为o~30(包括o和30)的标签,标识符八位位组应由如下单个八位位组编码构成:
a)位8和位7应编码为用来表示表1规定的标签类;
b)按8.1.2.5的规则,位6应为O或1;
c)位5至位1应把标签编号编码为二进制整数,位5是最高有效位。
表1 标签类的编码
类 |
位8 |
位7 |
通用 应用 上下文特定 专用 |
0 0 1 1 |
0 1 0 1 |
8.1.2.4对于编号大干或等于31的标签,标识符八位位组应包含一个引导八位位组及后随的一个或多个后继八位位组。
8.1.2.4.1 引导八位位组应编码如下:
a)位8和位7应编码为用来表示表1列出的标签类;
标识符符八位位组
图3标识符八位位组(低标签编号)
b)按8.1.2.5的规则,位6应为O或1 ;
c)位5至位1应编码为11111 2。
8.1.2.4.2后继八位位组应把标签编号编码如下:
a)除了最后1个标识符八位位组外,每个八位位组的位8应置1;
b)第1个后继八位位组的位7至位1.后随第2个后继八位位组的位7至位1,依次后随每个更后面的八位位组的位7至位1,直到并包括标识符八位位组中的最后1个后继八位位组,应是等于标签编号的无符号二进制整数的编码,以第1个后继八位位组的位7为最高有效位
c)第1个后继八位位组的位7至位不应都为O。
8.1.2.4.3图4示出了带有一个编号大于30的标签的类型的标识符八位位组形式。
图4标识符八位位组(高标签编号)
8.1.2.5若编码是原始编码,则位6置为0,若编码是结构化编码,则位6置为l。
注:对每种类型,以后各条规定了编码是原始编码还是结构化编码。
8.1.2.6 GB/T 16262.1--2006规定,使用关键字CHOICE定义的类型的标签采用类型的标签值.而类型的标签值采用已选定的数据值。
8.1. 2.7 GB/T 16262.2--2006的14.2和14.4中规定,如果“ObjectClassFieldType”是类型字段、可变类型值字段或可变类型值集合字段,则使用“ObjectClassFieldType”定义的类型的标签是不确定的。
该类型随后定义为ASN.1类型,然后其完整编码等同于所赋类型的值的完整编码(包括标识符八位位组)。
8.1.3长度八位位组
8.1.3.1 规定两种长度八位位组形式,它们是:
a) 确定形式(见8.1.3.3)1及
b)不定形式(见8.1.3.6)。
8.1,3.2如果编码
a)是原始编码,则发送器应使用确定形式(见8.1.3.3);
b)是结构化编码且都是立即可用的,则发送器应使用确定形式(见8.1.3.3)或不定形式(见8.1.3.6),作为发送器的一个选项;
c)是结构化编码且不都是立即可用的,则发送器应使用不定形式(见8.1.3.6)。
8.1.3.3 对于确定形式,长度八位位组应由一个或多个八位位组组成,并应表示使用短形式(见8.1.3.4)或长形式(见8.1.3.5)作为发送器一个选项的内容八位位组中的八位位组数。
注:若内容八位位组中的八位位组数小于或等于127时,仅使用短形式。
8.1.3.4在短形式中,长度八位位组应由单个八位位组组成,其中位8为0,位7至位1把内容八位位组(它们可能是O)中的八位位组数编码为无符号二进制整数,以位7为最高有效位。
例:L=38的编码为001001102。
8.1.3.5在长形式中,长度八位位组应由一个初始八位位组和一个或多个后继八位位组组成。,初始八位位组应编码如下:
a)位8应为1;
b)位7至位1应把长度八位位组中的后继八位位组数编码为无符号二进制整数,以位7为最高有效位.
c)应不使用值111111112。
注:引入这个限制是为了将来可能的扩展。
第1个后继八位位组的位8至位1,后随第2个后继八位位组的位8至位1,依次后随更后面八位位组的位8至位1,直至并包含最后1个后继八位位组,应是等于内容八位位组中八位位组数的无符号二进制整数的编码,以第1个后继八位位组的位8为最高有效位。
例:L=201 可编码为
10000001 2
11001001 2
注;在长形式中.是否使用比最少的必需数更多的长度八位位组是发送器的一个选项。
8.1.3.6对于不定形式,长度八位位组指示内容八位位组由内容结束八位位组来终止(见8.1.5),并应由单个八位位组组成。
8.1.3.6.1单个八位位组的位8应置为1,位7至位1置为O。
8.1.3.6.2若使用该长度形式,则应在内容八位位组之后的编码中出现内容结束八位位组(见8.1.5)。
8.1.4 内容八位位组
内容八位位组应由O个、1个或多个八位位组组成,并且应编码后续各条规定的数据值。
注:内容八位位组依赖于数据值的类型l后续各条遵循与ASN.1中相同的类型定义序列。
8.1.5 内容结束八位位组
若长度按8.1.3.6的规定编码,则应出现内容结束八位位组,否则应不出现。
内容结束八位位组应由两个值为O的八位位组组成。
注:内容结束八位位组可被认为是值的编码,其标签为通用类的,形式为原始编码,标签号为0.且内容不存在,
因此:
内容结束八位位组 |
长度 |
内容 |
00 |
00 |
无 |
8.2布尔值的编码
8.2.1 布尔值的编码应是原始编码。内容八位位组由单个八位位组组成。
8.2.2若布尔值是FALSE,则八位位组应为O。
若布尔值是TRUE,则八位位组应为任意非0值,作为发送器的一个选项。
例:若是BOOLEAN类型,值TRUE被编码为:
布尔 |
长度 |
内容 |
01 |
01 |
FF |
8.3整数值的编码
8.3.1 整数值的编码应是原始编码,内容八位位组由一个或多个八位位组组成。
8.3.2若整数值编码的内容八位位组由多个八位位组组成,则第1个八位位组的各个位和第2个八位位组的位8:
a)应不全为1;并且
b)应不全为O。
注.这些规则确保整数值总是用最小可能的八位位组数进行编码;
8.3.3内容八位位组应是等于整数值的对2的补码的二进制数,其组成是由第1个八位位组的位8至位1,后随第2个八位位组的位8至位1.依次后随每个八位位组的位8至位1,直到并包含内容八位位组的最后1个八位位组。
注:2的补码的二进制数的值通过计数内容八位位组中的位得出:计数从最后1个八位位组的位l开始作为位0.到第1个八位位组的位8结束.每位赋予一个2的数值,这里N是该位在上面计数序列中的位置2的补码的二进制数的值是:累加计算那些置1的位的数值,但不包括第1个八位位组的位8,然后,若第1个八位位组的位8置为1,则这个累加值减去第1个八位位组的位8的数值所得的结果。
8.4枚举值的编码
枚举值的编码应是与之相关的整数值的编码。
注;它是原始编码.
8.5实数值的编码
8.5.1 实数值的编码应是原始编码。
8.5.2如果实数值为O值,则编码中应没有内容八位位组。
8.5.3对非O实数值,如果抽象值的基数是10.则编码值的基数也应为10,如果抽象值的基数是2,则编码值的基数应为2、8或16.作为发送器的一个选项。
8.5.4如果实数值为非O值,那么用于编码的基数应为8.5.3规定的B7。如果B’是2、8或16,应使用8.5.6规定的二进制编码。如果B’是10,则应使用8.5.7规定的字符编码。
8.5.5第1个内容八位位组的位8应设置如下:
a)如果位8=1,则使用8.5.6规定的二进制编码;
b)如果位8---0,且位7=0,则使用8.5,7规定的十进制编码;
c)如果位8=0,且位7=1.则按8.5.8的规定编码一个“SpecialReal Value”(见GB/T 16262.1)。
8.5.6当使用二进制编码时(位8=1>,如果尾数M是非0.则它应由一个符号S、一个非负整数值N以及一个二进制比例因子F来表示,诸如:
M=S×N×2
0≤F<4
S=+l或-1
注;在某些环境下需要二进制比例因子F,以便将尾数隐含的小数点与本条编码规则所要求的位置对齐。这种对齐不能总是通过修改指数E来获得,如果用于编码的基数B’是8或16,隐含的小数点只能通过改变指数E分.
别以3个位或4个位为一步进行移动.因此,可能要求不是0的二进制比例因子的值,以便将隐含的小数点移动到所要求的位置。
8.5.6.1 如果S为-1.第1个内容八位位组的位7应为1.否则为O。
8.5.6.2第1个内容八位位组的位6至位5应编码基数B的值如下:
位6至位5 基数
0 0 基数为2
0 1 基数为8
1 0 基数为16
1 1 为本部分将来版本保留
8.5.6.3第1个内容八位位组的位4至位3应把二进制比例因子F的值编码为无符号二进制整数。
8.5.6.4第1个内容八位位组的位2至位l应编码指数格式如下:
a)如果位2至位1为00,那么第2个内容八位位组把指数的值编码为2的补码的二进制数.
b)如果位2至位1为01,那么第2个和第3个内容八位位组把指数的值编码为2的补码的二进制数5
c)如果位2至位l为10,那么第2、第3和第4个内容八位位组把指数的值编码为2的补码的二进制数5
d)如果位2至位1为11,那么第2个内容八位位组编码用于编码指数的值的八位位组的数,假定为x,(为无符号二进制数),并且第3个直到第(x加3)个(包括二者)内容八位位组将指数的值编码为2的补码的二进制数;x的值应至少为1.发送指数的最前9位应不全为0或不全为1。
8.5.6.5剩余的内容八位位组将整数N(见8.5.6)的值编码为无符号二进制数。
注1:对于非正则BER,没有尾数的浮点常规化的需求.这允许实现者发送包含尾数的八位位组,而不用在内存中对尾数执行移位功能。在正则编码规则和非典型编码规则中,规定了常规化,并且尾数(除非它是O)需要重复地移位直至最低有效位为l。
注2:实数数字的这种表示与通常用在浮点硬件中的格式有很大不同.但实数数字的表示已设汁成能容易地与这种格式来回地转换(见附录C)。
8.5.7 当使用十进制编码时(位8至位々一00),按SJ/Z 9047--1987中使用的术语,跟在第1个内容八位位组后的所有内容八位位组形成作为发送器一个选项的字段长度,并且按照SJ/Z 9047--1987进行编码。SJ/Z 9047--1987数字表示的选择由第1个内容八位位组的位6至位1规定如下。
位6至位1 数字表示
00 0001 SJ/Z 9047 NR1形式
00 0010 SJ/Z 9047 NR2形式
00 0011 SJ/Z 9047 NR3形式
位6至位1中剩余的值为本部分而保留。
应不使用伴随文件(见S]/Z 9047--1987)规定的比例因子。
注1:在SJ/Z 9047·1987中关于至少使用一个数字用到十迸制标记的左边的建议,在本部分中也建议这么做但并不是强制的。
注2:使用常规化形式(见SJ/Z 9047 -1987)是发送器的一个选项,这并不重要。
8.5.8当“SpecialRealV~tlues”被编码(位8至位7=01)时,应只有一个内容八位位组,有如下值:
01000000 值为PLUS-INFINITY
01000001 值为MINUS-INFINITY
位8至位7等于o和1的所有其他值分别为本部分的补篇而保留。
8.6位串值的编码
8.6.1 位串值的编码应是原始编码,或是结构化编码,作为发送器的选项。
注。在整个位申可用之前有必要传送部分位串时·使用结构化编码。
8.6.2原始编码的内容八位位组应包含一个初始八位位组,后随o个、1个或多个后继八位位组。
8.6.2.1 从引导位开始直到结尾位的位串值中的所有位,应置于第1个后继八位位组的位8至位1,后随第2个后继八位位组的位8至位1,依次后随每个八位位组的位8至位l,再后随从位8开始的最后1个后继八位位组需要的一些位。
注:术语“引导位”和“结尾位”在GB/T 16262.1-2006的21.2中定义。
8.6.2.2作为以位l为最低有效位的无符号二进制整数,初始八位位组应编码最后1个后继八位位组中未使用位的数。该数的范围应为O到7。
8.6.2.3若位串为空,应没有后继的八位位组,且初始八位位组应为O。
8.6.2.4在应用GB/T 16262.1--2006中的21.7时.BER编码器/解码器可以增加值的尾O位或从值中删去尾0位。
注:如果位申值没有置为1的若干位,那么编码器(作为发送器的选项)可以用一个长度为l和一个初始八位位组置为0来编码该值,或者可以将该值编码成带有一个或多个置为0的位后随初始八位位组。
8.6.3结构化编码的内容八位位组应由0个、1个或多个嵌套的编码组成。
注:每个这样的编码包括标识符、长度和内容八位位组,若它是结构化编码,则还可能包括内容结束八位位组。
8.6.4为用此方法编码位申值,应将其分段。每个段应由该值的一系列连续位组成,除最后一段外,应包含8的整数倍的位数。整个值中的每一位应精确地处于某一段内,但不应把有效位放在段边界上。
注:段可能是0长度的,即不包含任何位。
8.6.4.1 内容八位位组中的每个编码应表示整个位串的一个段,该编码出自本条的一种递归应用。在该递归应用中,把每个段处理为一个位串值。段的编码应按照这些位在整个值中的次序出现在内容八位位组中。
注l:作为该递归的结果,内容八位位组中的每个编码本身可能是原始编码或结构化编码。然而,通常这样的编码 将是原始编码。
注2:实际上,内容八位位组的标签总是通用类,编号为3。
8.6.4.2示例
若是类型BIT STRING,值‘0A3BSF291CD'H可以如下编码。在该示例中,位串表示是原始编码:
位串 |
长度 |
内容 |
03 |
07 |
040A3BSF291CDO |
上面示出的值也可以如下编码,在该示例中,位串表示是结构化编码:
位串 |
长度 |
内容 |
|
|
23
EOC 00 |
80
长度 00 |
位串 |
长度 |
内容 |
03 03
|
03 05
|
000A3B 045F291CDO
|
8.7八位位组串值的编码
8.7.1八位位组串值的编码应是原始编码或是结构化编码,作为发送器的选项。
注;在整个八位位组申可用之前有必要传送部分八位位组串时,使用结构化编码。
8.7.2原始编码包含O个、1个或多个值等于数据值中八位位组的内容八位位组,按照数据值中八位位组出现的次序,并使该数据值的八位位组的最高有效位与内容八位位组的一个八位位组的最高有效位对齐。
8.7.3结构化编码的内容八位位组应由O个、1个或多个编码组成。
注:每个这样的编码包括标识符、长度和内容八位位组。若它是结构化编码,则还可能包括内容结束八位位组。
8.7.3.1 为用此方法编码一个八位位组串值,将其分段。每个段应由该值的一系列连续八位位组组成。不应把有效位放在段边界。
注;段可能是0长度的,即不包含任何八位位组。
8.7.3.2内容八位位组中的每个编码应表示整个八位位组串的一个段,该编码出自本条的一种递归应用。在该递归应用中,把每个段处理为一个八位位组串值。段的编码应按照这些位在整个值中的次序出现在内容八位位组中。
注1:作为该递归的结果.内容八位位组中的每个编码本身可能是原始编码或结构化编码.然而,通常这样的编码将是原始编码。
注2:实际上.内容八位位组的标签总是通用类,编号为4.
8.8空值的编码
8.8.1 空值的编码应是原始编码。
8.8.2 内容八位位组应不包含任何八位位组。
注:长度八位位组为O。
例:若是NULL类型,NULL值可以编码为:
NULL 长度
05 00
8.9序列值的编码
8.9.1 序列值的编码应是结构化编码。
8.9.2内容八位位组应由ASN.1序列类型定义中列出的每个类型的一个数据值的完整编码组成,除非引用的类型带有关键字OPTIONAL或DEFAULT,否则这些编码按定义中的次序出现。
8.9.3引用的类型带有关键字OPTIONAL或DEFAULT.其数据值的编码可以出现,但不是必要的。若出现.则它应在按ASN.1定义的类型的编码的相应点上出现。
例;若类型为:
SEQUENCE{ name IA5 string, ok BOOLEAN}
值为:
{ name Smith,ok TRUE}
可以编码为:
Sequence Length Contents
30 0A IA5String Length Contents
16 05 "Smith"
Boolean Length Contents
01 01 FF
8.10单一序列值的编码
8.10.1 单一序列值的编码应是结构化编码。
8.10.2内容八位位组应由O个、1个或多个在ASN.1定义中列出的类型的数据值的完整编码组成。
8.10.3数据值编码的次序应与被编码的单一序列值中数据值的次序相同。
$.1 1 集合值的编码
8.11.1集合值的编码应是结构化编码。
8.11.2内容八位位组应由ASN.1集合类型定义中列出的每个类型的一个数据值的完整编码组成。
除非引用的类型带有关键字OPTIONAL或DEFAULT,否则这些编码按发送器选定的次序出现。
8.11.3 引用的类型带有关键字OPTIONAL或DEFAULT,其数据值编码可以出现,但不是必要的。
注:集合值中的数据值的次序不重要,对传送期间的次序没有限制。
8.12单一集合值的编码
8.12.1单一集合值的编码应是结构化编码。
8.12.2 同8.10.2。
8.12.3编码及后续解码时,不必保持数据值的次序。
8.13选择值的编码
选择值的编码应与被选择的类型值的编码相同。
注l:依照被选择的类型而定,编码可以是原始编码或结构化编码。
注2:按照ASN.1选择类型定义的规定,用于标识符八位位组的标签是被选择的类型的标签.
8.14有标签值的编码
8.14.1 有标签值的编码应由8.14.2和8.14.3中规定的“TaggedType”记法中出现的类型所对应数据值的完整编码(称为基编码)导出。
8. 14.2若类型定义中未使用隐式的标签(见GB/T 16262.1--2006的30.6).则编码应是结构化编码,内容八位位组应是完整的基编码。
8.14.3若类型定义中使用了隐式标签,则:
a)若基编码是结构化编码,则编码也应是结构化编码,否则应是原始编码;
b)内容八位位组应与基编码的内容八位位组相同。
示例:
由ASN.1类型定义(在一个显式标签的环境中):
Type l::= VisibleString
Type 2::=[APPLICATION 37 IMPLICIT Type l
Type 3::=[2]type 2
Type 4::=APPLICATION 7] IMPLICIT Type 3
Type 5::=[27 IMPLICIT Type 2
值“Jones”编码如下:
对Type 1:
VisibleStringLength Contents
1A 05
4A6F6E65731
对Type 21
[APPLICATION 3] Length Contents
4 316 05 4A6F6E6573,s
对Type 3:
[2] Length Contents
A2x6 07
[APPI.ICATlON 3] l.ength Contents
4316 05 4A6F6E6573
对Type 4:
[APPI.ICATION 7]
67
对Type 5.
Length Contents
05 4A6F6E65731e
8.15开放类型的编码
开放类型的值也是某一(其他)ASN.1类型的值。这种值的编码应是在此为认为是其他类型的值而规定的完整编码。
8.16单一实例值的编码
8.16.1单一实例值的编码应是下列带有8.16.2规定的值的序列类型的BER编码。
[UNIVERSAL 8] IMPLICIT SEQUENCE{
type-ld <DeflnedObjectClass>. &Id,
value[们EXPLICIT <DeflnedObjectClass>.&Type
}
其中,“<DefinedObjectClass>”被用于“InstanceOfType”记法的特定“DefinedObj ectClass”所替换。
注;当值是单个ASN.1类型的值,并且使用BER编码时,该类型的编码等同于外部类型的对应值的编码,其中替换的语法是指用来表示该抽象值。
8.16.2 8.16.1中的序列类型的成分值应与GB/T 16262.2--2006的C.7中相关类型的对应成分的值相同。
8.17嵌入式pdv类型值的编码
8.17.1 嵌入式pdv类型值的编码应是在GB/T 16262.1--2006的33.5中定义的类型的BER编码。
8. 17.2 data-value OCTET STRING的内容应是使用已标识的传送语法的嵌入式pdv类型(见GB/T16262.1--2006中的33.3a))的抽象数据值的编码,并且所有其他字段的值应与出现在抽象值中的值相同。
8.18外部类型值的编码
8.18.1外部类型值的编码应是假设定义在EXPLICIT TAGS环境中,其值按如下规定的序列类型的BER编码。
[UNIVERSAL 8] IMPLICIT SEQUENCE (
direct-reference OBJECT IDENTIFIER OPTIONAL,
indirect-reference INTEGER OPTIONAL,
data-value-descriptor ObjectDescriptor OPTIONAL,
encoding CHOICE {
slngle-ASNl-type [0] ABSTRACT-SYNTAX.&Type,
octet-aligned [1] IMPLICIT OCTET STRING,
arbitrary [2]IMPLICIT BIT STRING})
注。由于历史原因,该序列类墅与GB/T 16262.1中规定的序列类型不同.
8.18.2字段的值依赖于要发送的抽象值,也即在GB/T 16262. 1--2006中的34.5中规定的类型的值。
8.18.3当且仅当data-value-descriptor出现在抽象值中,并且应有相同的值时,上述data-value-de-scrlptor应出现。
8.18.4 上述direct-reference和indirect-reference的值应按照表2来出现或不存在-表2把GB/T 16262.1--2006中的34.5中定义的外部类型替换的标识映射成18.8.1中定义的外部类型成分的direct-reference和indirect-reference.
表2标识用的替换的编码
identification |
direct-reference |
indirect-reference |
syntaxes |
***不能出现*** |
***不能出现*** |
syntax |
syntax |
不存在 |
presentstion-eontext-id |
不存在 |
presentation-eontext-id |
context-negotiation |
传送语法 |
presentation-context-id |
表2(续)
identification |
direct-reference |
indirect-reference |
transfer-syntax |
***不能出现*** |
***不能出现*** |
fixed |
***不能出现*** |
***不能出现*菁* |
8.18.5数据值应按照编码标识的传送语法进行编码,并应将该数据值放入下面规定的替换的编码选择中。
8.18.6如果数据值是单个ASN.1数据类型的值,并且用于该数据类型的编码规则是本部分中规定的编码规则之一,则发送实现应使用下列任何编码选择:
·单个ANS.1类型
·八位位组对齐的
·任意的
作为一实现选项。
8.18.7如果使用商定的或协商的编码规则的数据值的编码是八位位组的整数倍,则发送实现应使用下列任何编码选择:
·八位位组对齐的
·任意的
作为一实现选项。
注:一系列ASN.1类型的,并且传送语法规定了通过将ASN.1基本编码规则应用于每个ASN.1类型所产生的八位位组串的原始拼接的数据值归入该范畴,而不是归入8.18.6的范畴。
8.18.8如果使用商定的或协商的编码规则的数据值的编码不是八位位组的整数倍,则编码选择应是:
·任意的
8.18.9如果编码的选择是单个ANS.1类型,那么ASN.1类型应替换开放类型,其值等于要编码的数据值。
注:可能出现在开放类型中的值的范围通过与direct-reference相关的客体标识符值,和/或与Indirect-reference相关整数值的注册来确定。
8. 18. 10如果编码的选择选定为八位位组对齐的,那么,数据值应按照商定的或协商的编码传送语法进行编码,所得出的八位位组应形成八位位组串的值。
8.18.11 如果编码的选择是任意的,那么,数据值应按照商定的或协商的编码传送语法进行编码,其结果应形成位串的值。
8.19客体标识符值的编码
8.19.1 客体标识符值的编码应是原始编码。
8.19.2 内容八位位组应是一起拼接的子标识符(见8.19.3和8.19.4)的编码的(有序)列表。
每个子标识符表示一系列(1个或多个)八位位组。每个八位位组的位8指示它是否为该系列的最后1个八位位组;最后八位位组的位8为Ol前面的每个八位位组的位8为1。序列中这些八位位组的位7到位1共同编码为子标识符。在概念上,这些位被拼接起来,以形成一个无符号的二进制数,其最高有效位是第1个八位位组的位7,最低有效位是最后1个八位位组的位1,子标识符应尽可能最少地用八位位组来编码,也就是说,子标识符的引导八位位组应没有值80。
8.19.3子标识符的编号(N)应比被编码的客体标识符值中的客体标识符的成分的编号少1.
8.19.4第1个子标识符的数值从被编码的客体标识符值中的前两个客体标识符成分的值导出。使用公式
(X×40)+Y
其中:X是第1个客体标识符成分的值,y是第2个客体标识符成分的值。
注:这种前两个客体标识符成分的组合认可的只有三个值由根结点赋予,且由X=0和X=1达到的结点最多赋予39个后继值。
8.19.5第i个子标识符(2≤i≤N)的数值是第(i+1)个客体标识符成分的数值。
示例:OBJECT IDENTIFIER的值
{joint-iso-itu-t 100 3)
它与下式相同
{2 100 3)
其第1个子标识符为180,第2个子标识符为3。所得到的编码为:
OBJECT
IDENTIFIER Length Contents
03 813403
06
8.20相关客体标识符值的编码
注:相关客体标识符中的客体标识符成分的编码与客体标识符中成分(在第2个之后)的编码相同.
8.20.1 相关客体标识符值的编码应是原始编码。
8.20.2 内容八位位组应是一起拼接的子标识符(见8.20.3和8.20.4)的编码的(有序的)列表。每个子标识符表示一系列(1个或多个)八位位组。每个八位位组的位8指示其是否是系列中的最后1个八位位组:最后1个八位位组的位8是0,前面的每个八位位组的位8为l。序列中这些八位位组的位7至位1共同编码为子标识符。在概念上,这些位的组被拼接起来,以形成一个无符号的二进制数.其最高有效位是第1个八位位组的位7,最低有效位是最后1个八位位组的位1。子标识符应尽可能最少地用八位位组来编码,也就是说,子标识符的引导八位位组应没有值80。
8.20.3子标识符的编号(N)应等于要被编码的相关客体标识符值中的客体标识符的编号。
8.20.4第i个子标识符(1≤i≤N)的数据值是要被编码的相关客体标识符值中的第i个客体标识符的数据值。
8.20.5示例,一个相关客体标识符值为;
{ 8571 3 2}
其子标识符为8571、3和2。所得到得编码为:
RELATIVE OlD Length Contents
OD 04 C2780302
8.21 受限字符串类型值的编码
8.21.1 数据值由ASN.1类型定义中规定的字符集中的字符串组成。
8.21.2每个数据值应编码为独立于同一类型的其他数据值。
8.21.3每个字符串类型应按如下说明的方式进行编码:
[UNIVERSAL x]IMPLICIT OCTET STRING
其中.X是指派给GB/T 16262.1--2006中的字符串类型的通用类标签编号。八位位组串的值在8.21.4和8.21.5中规定。
8.21.4在GB/T 16262.1--2006中,若直接引用一个枚举表(NumericString和PrintableStrlng)来规定字符串类型,则八位位组串的值应是在8.21.5中为带有相同字符串值的VlsibleString类型规定的值。
8.21.5对于除UniversalString和BMPString串之外的受限字符串,八位位组串应包含GB/T 2311中为8位环境的编码所规定的八位位组,使用按照GB/T 12054登记的转义序列和字符编码.
8.21.5.1 除非在GB/T 16262.1--2006中用来定义字符串类型的登记号之一中有规定的转义序列,否则不使用转义序列。
8.21.5.2 在每串的开始处,某些登记号应被假设为指明的GO和/或CO和/或C1,且被调用(使用GB/T 2311的术语)。表3将对每个类型以及它们隐式的假定的转义序列加以规定。
8.21.5.3某些字符集串类型的编码中应不包含显式转义序列;在所有其他情况下,8.21.5.1允许的任何转义序列可以在任何时候出现,包括在编码的开始处。表3列出允许有其显式转义序列的类型。
表3 转义序列的使用
类 型
|
假定的GO
(登记号) |
假定的CO和Cl
(登记号) |
假定的转义序列和镇定
移位(在可用处) |
是否允许 显式转义序列
|
NumericString |
6 |
无 |
ESC 2/8 4/2/.SO |
否 |
PrintableString |
6 |
无 |
ESC2/8 4/2 LSO |
否 |
TeletexString
(T61 String)
|
102
|
106(C0)
107(C1)
|
ESC 2/8 7/5 LSO
ESC 2/1 4/5
ESC2/2 4/8 |
是
|
VideotexString
|
102
|
1(C0)
73(C1)
|
KSC 2/8 7/5 LS0
ESC 2/1 4/O
ESC 2/2 4/1 |
是
|
VisibleString
(GB/T 1988) |
6
|
无
|
ESC 2/8 4/2 LS0
|
否
|
IA5String
|
6
|
1 (CO)
|
ESC 2/8 4/2 LS0 ESC 2/1 4/0 |
否
|
GraphicString |
6 |
无 |
ESC 2/8 4/2 LSO |
是 |
GeneralString
|
6
|
1(CO)
|
ESC 2/8 412 LSO
ESC 2/1 4/0 |
是
|
注:有许多通常使用的字符(例如,A到Z)出现在具有各个登记号和转义宁列的许多字符表中.当ASN.1类型 允许转义序列时,对一个特定的字符串有多种编码是可能的(见7.3)。 |
8.21.5.4应不使用宣布符,除非ASN.1用户有明确允许。
注:ASN.1类型的选择还提供了一个宣布符功能度的有限形式。特定应用协议可以选择.以便在其他协议要素中携带宣布符或者详细地规定使用宣布符的方式。
示例:这个示例的类型定义为:
Name::=VisibleString
其值为
“Jones”
可被编码(原始编码形式)为:
VisibleString Length Contents
1A 05 4A6F6E65734A6F6E657316
或(结构化编码形式,确定长度)为:
VisibleString Length Contents
3A 09
OctetString Length Contents
04 03 4A6F6E
OctetString Length Contents
04 02 657302
8.21.6上述示例示出了三种(更多)可能的有效形式,作为发送器的一个选项。要求接收器处理所有允许的形式(见7.3)。
8.21.7对UniversalString类型,八位位组串应包含在GB 13000.1--1993中规定的使用4个八位位组正则形式(见GB 13000.1--1993中的13.2)的八位位组。不应使用特定符号。如果控制功能满足被8.21.9施加的限制,则可以使用该控制功能。
8.21.8对BMPString类型,八位位组串应包含在GB 13000. 1--1993中规定的使用2个八位位组BMP形式(见GB 13000.1--1993中的13.1)的八位位组。不应使用特定符号。如果控制功能满足被8.21.9施加的限制,则可以使用该控制功能。
8.21.9在下列例外的情况下,可以使用GB/T 5261--1994中的CO和C1控制功能。
注l:本条的效果是当禁止对其他字符集使用转义时,允许有用的控制功能,例如;LF、CR、TAB等。
注2:对BMPString,C0和C1控制功能被编码为两个八位位组,对Universa]String,CO和CI控制功能被编码为四
个八位位组。
a)应不使用GB/T 2311--2000中定义的宣布符转义序列。
注3:假设的字符编码环境是GB 13000.1。
b)应不使用GB/T 2311--2000中定义的指明或标识转义序列,包括GB 13000.1--1993的17.2和17.4所允许的标识转义序列。
注4:ASN.1允许使用PermittedAlphabet子类型记法来选择允许的字符集。PermittedAIphabet也用来选择
GB 13000.1的实现级别。BMPString总是用于两个八位位组的形式.UniversalString总是用于四个八位位组的形式。
c) 应不使用调用GB/T 2311--2000的转义序列或控制序列,例如SHIFT IN(SI)、SHIFT OUT(S0)或LOCKING SHIFT FOR G3(SS3).
d) 编码应与GB 13000.1--致,并保留在该代码集中。
e)应不使用按照GB 13000.1--1993的16.3标识图形字符子集的控制序列。
注5:ASN.1的应用使用划分子类黧来指示GB 13000.1图形字符的子集,和选择与GB/T 2311控制字符相对应的GB 13000.1字位.
f)GB 13000.1--1993的16.5转义序列不应被用于切换到GB/T 2311代码。
8. 21.10对于UTFSString类型,八位位组串应包含GB13000.1-1993中的附录D中规定的八位位组。不应使用宣布符和转义序列,并且每个字符应按对该字符有效的最小数的八位位组进行编码。
8.22无限制字符串类型值的编码
8.22.1无限制字符串类型值的编码应是GB/T 16262.1--2006中的40.5定义的类型的BER编码。
8.22.2 string-value OCTET STRING的内容应是使用已标识的字符传送语法的无限制字符串类型(见GB/T 16262. 1--2006中的40.3a))的抽象字符串值的编码,并且所有其他字段的值应与该抽象值中出现值相同。
8.23下列“有用的类型”应编码为已经用GB/T 16262.1--2006中的42至44中给出的定义所替代:
·通用时
·世界协调时
·客体描述符
9正则编码规则
正则编码规则使用的数据值的编码是第8章描述的基本编码及下列的限制,这些限制也在第11章中列出。
9.1长度形式
如果编码是结构化编码,则应使用不定长度形式。如果编码是原始编码,应包括必要的最短长度的八位位组[与8.1.3.2 b)对比]。
9.2串编码形式
如果位串八位位组串和受限字符串的值要求不大于1000个内容八位位组,则应使用原始编码对它们进行编码,否则,应使用结构化编码。结构化编码中包含的串分片应使用原始编码进行编码。每个分片的编码,除了可能的最后一个分片外,应具有1000个内容八位位组(与8.21.6对比)。
9.3集合成分
集合值的成分值的编码应按照GB/T 16262.1--2006中的8.6中规定的标签所确定的次序出现。此外,当一个或多个成分是无标签的选择类型时,为确定成分的编码次序,每个无标签的选择类型也被排序,好像该类型有一个与该选择类型或其中嵌套的任何无标签选择类型中的最小标签相等的标签.
示例:
假设有一个IMPLICIT TAGS的置标签环境:
A::=:SET
{
a [3]INTEGER,
b [1]CHOICE
{
c[2] INTEGER,
d[4] INTEGER
},
eCHOICE
{
fCHOICE
(
g [5]INTEGER,
h [6]INTEGER
).
ICHOICE
{
j [O]INTEGER
)
}
编码集合成分的次序将总是e、b和a,因为tag[O]的排序最低,其次是[1],再其次是[3].
10非典型编码规则
非典型编码规则使用的数据值的编码是第8章描述的基本编码及下列的限制,这些限制也在第11章中列出。
10.1长度形式
应使用确定长度编码形式,用最小数目的八位位组进行编码[与8. 1.3.2 b)对比]。
10.2串编码形式
对位串八位位组串和受限字符串类型,应不使用结构化编码的形式(与8.21.6对比)。
10.3集合成分
集合值的成分值的编码应按照GB/T 16262.1--2006中的8.6中规定的标签所确定的次序出现。
注:当集合的成分是无标签的选择类型时,该成分在次序中的位置将依赖于要编码的选择成分的标签。
11 CER和DER使用BER的限制
在第8章及其各条对“应是BER编码”的引用应解释为“适当时,应是CER或DER编码”(见8.16.1、8.17.1、8.18.1和8.22.1).
11.1 布尔值
如果编码表示布尔值TRUE,则其单个内容八位位组应使所有8位都置1(与8.2.2对比)。
11.2未使用的位
11.2.1 位串值编码的最后1个八位位组的各个未使用的位应置O。
11.2.2在应用GB/T 16262.1--2006中的21.7时,应在编码位串之前除去所有尾O位。
注1.在使用大小限制的情况下,解码器交付给应用的抽象值是那些满足该大小约束的抽象值之一,并且仅仅不同于用若干尾0位发送的值。
注2:如果位串值没有置1的位,那么,编码器应编码长度为1和初始八位位组置O的值.
11.3实数值
11.3.1如果编码表示基数B是2的实数值,则应使用利用基数2的=进制编码。在编码之前,选定尾数M和指数E.使M是O或奇数。
注:这是必要的,因为若M≠M,同一个实数值可以看成{M.2.E)和{M,2.E),对某一非O的整数n:
M=M×2
E=E+n
在值的编码中,二进制比例因子F应为O,M和E应分别用必需的最少八位位组表示。
11.3.2如果编码表示基数B为10的实数值,则应使用十进制编码。在形成编码时,下列内容适用:
11.3.2.1应使用SJ/Z 9047--1987 NR3形式。
11.3.2.2 编码中应不使用SPACE。
11.3.2.3如果实数值是负数,则它应以MINUS SIGN(-)开始,否则,它应以一个数字开始。
11.3.2.4尾数的第1个和最后1个数字都不可以是O。
11.3.2.5尾数的最后1个数字后应紧跟一个FULL STOP(.),再跟一个指数记号E。
11.3.2.6如果指数是O,它应写成“+O”,否则,指数的第1个数字不应是O,也不应使用PLUS SIGN。
11.4 GeneralString值
仅当字符的登记项当前不指明为GO、G1、G2、G3、CO或C1集时.GeneralString类型(及其子类型)值的编码应生成转义序列,以指明和调用新的登记项。所有指明和调用应进入最小编号的G或C集合,对于G或C集合来说,存在与转义序列一起要使用的编码字符集的国际登记簿中的项所定义的一个转义序列。
注1:对于上述条款的目的,G0是最小编号的G集,然后依次是G1、G2和G3。CO是最小编号的C集,随后是C1.
注2:字符串值中的每个字符与编码字符集的国际登记簿中的特定项有关联。
11.5默认值的集合和序列成分
集合值或序列值的编码应不包括等于其默认值的任何成分值的编码。
11.6单一集合成分
单一集合值的成分值的编码应按升序出现,要被比较的编码八位位串正如带有较短成分的八位位串在其尾端用置为0的八位位组来填充那样进行比较。
11.7 GeneralizedTime(通用时)
11.8 UTCTime(世界协调时)
11.8.1编码应按照GB/T16262.1-2006对UTCTime条所描述的那样,以一个“Z”字来终止。
11.8.2秒元素应总是存在的
11.5.3午夜(GBT)应该以下列形式表示:
“YYMMDD000000Z”
其中 ,“YYMMDD000000Z”表示上述午夜之后的一天
11.8.4有效表示的示例
“920521000000Z”
“920622123421Z”
“920722132100”
11.8.5无效表示的示例
“920520240000Z”(不正确表示的午夜)
“9207221321Z”(“00”秒被忽略)
12 传送语法定义中的BER、CER和DER的使用
12.1 对于单个ASN.1类型的所有值,无论何时需要规定一个无歧义的、不可分割的和自界定的八位位组串的表示,都可以引用和应用本部分规定的编码规则。
注:所有这样的八位位组串在单个ASN.1类型的范围内是无歧义的。若与不同的ASN.1类型的编码相混合,则不一定是无歧义的。
12.2下列客体标识符和客体描述符的值被赋予用来标识和描述本部分规定的基本编码规则:
{jolnt-iso-itu-t asnl(1)basic-encoding (1))和
“Basic Encoding of a single ASN.1 type”
12.3下列客体标识符和客体描述符的值被赋予用来标识和描述本部分规定的正则编码规则:
{joint-iSo-itu-t asnl(1)bet-derived(2) canonical-encoding(0))和
“Canonical encoding of a single ASN.1 type”
12.4下列客体标识符和客体描述符值被赋予用来标识和描述本部分规定的非典型编码规则:
{joint-iso-itu-t asnl(1)bet-derived(2) distinguished-encoding(I))和
“Distinguished encoding of a single ASN.1 type”
12.5在无歧义的规范将抽象语法定义为抽象值的集合时,其中每一个就是某一特定命名的ASN.1类型的值,通常(但不一定)是选择类型的值,那么,12.2、12.3或12.4中规定的客体标识符的值之一可以与抽象语法名称一起用来分别标识出对应在定义抽象语法时所使用的、特定命名的ASN.1类型的基本编码规则、正则编码规则或非典型编码规则。
12.6在12.2、12.3和12.4中规定的名字不应与抽象语法名称一起用来标识传送语法,除非满足抽象语法定义用的12.5中的条件。
附 录A
(资料性附录)
编码的示例
本附录通过提出一个用ASN.1定义的<假想)人事记录的八位位组表示来说明本部分中的基本编码规则。
A.1 记录结构的ASN.1.描述
假想的人事记录的结构在下面使用GB/T 16262.1--2006中为了定义类型而规定ASN,1形式描述。
PersonnelRecord::=[APPLICATION 0] IMPLICIT SET{
Name Name,
title [0] VisibleString,
number EmployeeNumber,
dateOfHire [1] Date,
nameOfSpouse [2] Name,
children [3] IMPLICIT
SEQUENCE OF Childlnformation DEFAULT{}}
ChiIdlnformation::=SET
{ name Name,
dateOfBirth [0] Date)
Name::=[APPIACATlON l]IMPLICIT SEQUENCE
{ givenName VisibleString,
initial VisibleString,
familyName VisibleString}
EmployeeNumber::=[APPLICATION 2] IMPLICIT INTEGER
Date::=[APPLICATION 3] IMPI.ICIT VisibleString-- YYYYMMDD
A.2记录值的ASN.1描述
John Smith的个人记录的值使用ASN.1进行形式描述如下:
{name {givenName "John",initial "P",iamilyName "Smith"},
title "Director",
number 51,
dateOfHire 4 ”19710917",
nameOfSpouse {givenName "Mary", initial "T", familyName "Smi th"},
children
{
{ name {gi venName “Ralph”, initial "T", familyName "Smith"},
dateOfBirth "19571111"
},
{ name {givenName "Susan", initial "B", familyName "Jones"},
dateOfBirth "19590711"
A.3该记录值的表示
上面所给的记录值用八位位组的表示如下(应用了本部分定义的基本编码规则后)。标识符、长度和整数的内容八位位组的值用十六进制表示,每个八位位组是二个十六进制数。字符串内容的值的表示为文本,每个八位位组一个字符。
附录B
(资料性附录)
客体标识符赋值
下列值在本部分中赋值:
条 客体标识符值
12.2 {joint-iso-itu-t asnl (1) basic-encoding (1))
客体描述符值
“Basic Encoding of a single ASN.1 type”
条 客体标识符值
{joint-iso-itu-t asnl (1) ber-derived(2) canonical-encoding(O))
12.3 客体描述符值
“Canonical encoding of a single ASN.1 type”
条 客体标识符值
12.4 {joint-iso-itu-tasnl (1) ber-derived(2) distinguished-encoding(I))
客体描述符值
“Distinguished encoding of a single ASN.1 type”
附录C
(资料性附录)
实数值编码的实例
C.1 发送器通常检查自己的硬件浮点表示,以便确定用来传送在该浮点表示与ASN.1实数值编码的长度八位位组和内容八位位组之间的值的(依赖于值的)算法。本附录说明了通过使用图C.1所示的尾数的(人工)硬件浮点表示在这样的过程中能够采取的步骤。
假设该指数作为一个整数E它能容易地从浮点硬件得到。
图C.1 浮点表示
C.2需要为了发送使用二进制编码的非o值(如本部分正文中的规定)而产生的内容八位位组是:
l S bb ff ee E的八位位组 N的八位位组
其中S(尾数符号)依赖于被转换的值,bb的固定的值(比如lo),以表示基数(本例中假定基数为16),ff是如c.3的描述计算出的F值.ee是如c.4的描述计算出的指数值的固定长度(本附录不处理E需要超过3个八位位组的情况)。
C.3在强制第1个八位位组的位8至位3和第5个八位位组的位4至位l为o后,该算法将发送作为N值的硬件表示的八位位组1到5.假设隐含的十进制小数点被定位在交付E值的硬件表示中的八位位组1的位2和位1中间,发送之前通过减去E值,其隐含位置能移位到第5个八位位组之后的最近的点上。在我们的示例系统中,我们对每个指数的减量能移4位(因为我们假定基数为16),所以9的减量将隐含的小数点定位在第6个八位位组的位6和位5中间。这样值M是N乘以23,以便正确地定位M中的小数点(所传送八位位组的N中隐含的位置是在第5个八位位组的位1之后)。这样我们得到关键的参数:
F=3(所以ff是11)
指数减量=9
C.4指数所需要的长度现在通过求出表示下列值所需要的八位位组的最大数计算出来,
Emin——超过量——指数减量
Emin——超过量——指数减量
其中.Emin和Emin是指数表示法的最小和最大整数值,超过量是为了产生真实指数值而需要减去的任何值,指数减量如C.3计算出来。假设给出3个八位位组的长度。那么ee是10。也假设超过量为0.
C.5现在,发送算法是:
a)对予ASN.1类型实数,发送带有标签的基本编码规则标识符八位位组字段;
b)测试0,如果测试完成,发送带有值为o的ASN.1基本编码规则长度字段(无内容八位位组),并结束该算法;
c)测试并记忆尾数符号,并且如果为负,尾数取反;
d)传送带有值为9的ASN.1基本编码规则长度字段,那么:
——若为负 则11101110;或者
一一若为正 则10101110
e)产生并发送有下列指数值的3个八位位组:
E=9;
f)将第1个八位位组的位8至位3和第5个八位位组的位4至位1置为0,然后发送5个八位位组尾数。
C.6接收算法必须准备处理任何ASN.1基本编码,但这里可以直接使用浮点单元。我们按如下内容进行:
a)检验第1个内容八位位组,如果它是1×101110,我们得到的传输与我们的算法相一致,并且能简单地逆转发送算法。
b)否则,对字符编码,调用标准字符十进制为浮点的转换软件,并根据应用语义(可能设置硬件浮点能处理的最大和最小数)来处理“SpecialRealValue”。
c)对二进制传输,将N放人浮点单元,如有必要丢弃最低有效位结束处的八位位组,乘以2F和Be,如有必要取反。实现者可以发现在特定情况下可能的优化技术,但也可以发现(除了与兼容机的发送相关的优化技术外)对它们进行测试得不偿失。
C.7 上述算法只是实例,当然,实现者将确定他们自己最好的策略.
2962