”((\d#2)(\d#2)(\d#4))”一\1是日期而\2是月、\3是星期几和\4是年。
注:对形式引用常规表达式的子表达式在许多情况下有要求,一个这样的实例是衙要写出文本将ASN.1模块中的常规表达式归档。这是能用来提供这种引用的记法.该记法不在本部分中的其他地方使用。
附录B
(规范性附录)
类型和值兼容的规则
本附录希望主要为工具建造者使用以保证他们能相同地解释语言。本附录的目的是为了清楚地规定什么是合法的ASN.1和什么是不合法的ASN.1,而且能够规定任意值引用名标识符的精确值,以及任意类型或值集引用名标识符的精确值集。不准备用它来提供任何上面描述以外目的的ASN.1记法的有效转换的定义。
B.1需要值映射概念(辅导介绍)
B.1.1 考虑下面ASN.1定义:
A::= INTEGER
B::=[1] INTEGER
C::=[2] INTEGER (0..6,…)
D::=[2]INTEGER(O一6,…,7)
E::= INTEGER(7..20)
F ::= INTEGER {red(0), white (1), blue(2), green(3), purple(4))
a A::=3
b B::=4
c C::=5
d D::=6
e E::=7
f F::=green
B.1.2很清楚,值引用a、b、c、d、e和f能用在分别由A、B、C、D、E和F支配的值记法中.例如,
W::一SEQUENCE{wl A DEFAULTa)
和
2a和
Y::=A(1..a)
都是B.I.I中给出定义的有效值.然而,如果上面的A用B、或C、或D、或E、或F替代,产生的语句将合法吗?同样,如果上面的值引用a在每一个这种情况下用b、或c、或d、或e、或f替代,产生的语句合法吗?
B.1.3更复杂的问题将考虑在每种情况下用赋值右边的显式文本来代替类型引用。考虑下边的
示例:
f INTEGER {red(0), white (1), blue(2), green(3), purple(4)}::=green
W::= SEQUENCE{
wl INTGER {red(0), white (1), blue(2), green(3), purple(O) DEFAULT f}
x INTEGER {red(0), white (1), blue(2), green(3), purple(4)}::==f
Y::= INTEGER {red(0), white (1), blue(2), green(3), purple(4)) (1..f)
上面的是合法的ASN.1吗?
B.1.4某些上面的示例即使是合法(大部分是——见后面的文本)的情况,将奉劝用户不要书写类似的文本,因为它们至少有些模糊和最容易混淆。然而,经常会把某些类型值(不必正好是INTEGER类
型)的值引用用作为带有应用于支配者中的置标记或分成子类型的那个类型的默认值。引入值映射概念是为了提供确定上面哪种构造是合法的清楚和精确手段。
B.1.5再考虑:
C::=[2]INTEGER(O一6,…)
E::= INTEGER(7—20)
F::: INTEGER{red(0), white (I), blue(2), green(3), purple(4)}
在每种情况下产生新的类型。对于F,我们能在它的值与通用类型INTEGER的值之间清楚地1-1对应标识.在C和E的情况下,我们能在它们的值与通用类型INTEGER的值的子集之间清楚地1:1对应标识。我们把这种关系称作两个类型中的值之间的值.映射。而且,因为F、C和E中的值都与INTEGER值的(1-1)映射,我们能用这些映射提供F、C和E它们本身值之间的映射。对F和C,在图
B.1中示出.
圈B.1
B.I.6现在当我们有下列值引用:
cC::=5
对于在某些上下文中要求用C中的值来标识F中值,那么,只要C中的那个值和F中的(单个)值存在值映射,我们能(且确实)定义c是F中值的合法引用。这在图B.2中示出,其中值引用c用来标识F中的值,而且能用在我们应该另外必须定义下列直接引用f1的地方。
fIF::=5
B.1.7应该注意,在某些情况下,在一个类型中应有值(例如,B,I.1的A中的7至20)与另一个类型中的值(例如.B.1.1的E中的7至20)有值映射,但是其他值(A的21以上)没有这种映射。A中这类值的引用不会提供E中值的有效引用.(在本例中,整个E与A的子集有值映射。在一般情况下,在有值映射的两种类型中可能都有值的子集.其他值在没有映射的两种类型中。)
B.1.8在ASN.1中标注,用正常的英语文本来规定上面和类似情况中的合法性。B.6章给出合法性的精确要求并且应该在对复杂结构有疑虑时引用。
注:“Type”结构的两个事件之间定义存在值映射的事实允许采用(使用一个“Type”结构建立的)值引用来标识另一个充分相似的“Type”结构中的值。它允许用两个文本膈开、没有与虚拟和实际参数兼容性规则相冲突的“Type”结构来将虚拟和实际参数归类。也允许用一个“Type"结构来规定信息客体类别的范围和用充分相似的、不同“Type”结构规定信息客体中的对应值。(这些示倒不是无遗漏的。)然而,建议利用这一自由的优点只是为了简单的情形,如,SEQUENCE OF INTEGER,或CHOICE{ int INTEGER,id OBJECT IDENTIFER},而
不能用于更复杂的~Type"结构.
图B.2
B.2值映射
B.2.1基础的模型是类型,像非重叠的容器,包含值,有定义不同新类型(见图B.1和B.2)的每个ASN.1“Type"结构事件。本附录规定当这些类型间存在茁映射,以及在需要引用某些其他类型中的值时,可使用引用一个类型中的值。
例如:考虑:
X::一INTEGER
Y::= INTEGER
X和Y是两个不同类型的类型引用名(指针),但是,这些类型间存在值映射,因此,当由Y支配时(例如,紧跟DEFAULT后面),可采用X值的任意值引用。
B.2.2在所有可能的ASN.1值集中,值映射把一对值关联起来。值映射的整个集合是数学关系。这个关系具有下面的特性z它是反身的(每个ASN.1值与本身有关).对称的(如果从值xl到值x2定义存在值映射,那么从x2到xl自动存在值映射),而且,它是可传递的(如果从值xl到值x2有值映射,而且从值x2到值x3有值映射,那么,从xl到x3自动存在值映射)。
B.2.3另外,给出任意两个类型XI和X2,视为值集,从X1中的值到X2中的值的值映射集是一一对应关系,即,对于X1中所有的值xl、X2中的x2,如果从xl到x2有值映射,那么:
a)从xl到X2中另一个不同于x2的值没有值映射;和
b)从Xl中的任意值(非xl)到x2没有值映射。
B.2.4在值xl和值x2之间存在值映射时,如果某些支配类型这样要求的话,能自动地采用任一个的值引用。
注:某些“Type”结构中的两个值之间定义了存在值映射的事实仅仅为了提供使用ASN.1记法的灵活性,这些映射的存在不携带暗示两种类型携带相同的应用语义,但是,建议只有对应的类型确实携带相同的应用语义,才使用无值映射就是非法的ASN.1结构.注意,值映射将经常存在于同一ASN.1结构中的两个类型之间任意的大规范中,但是,携带完全不同应用语义,而且这些值映射的存在从不用于确定整个规范的合法性
B.3相同类型定义
B.3.1用相同类型定义的概念来使值映射能在相同或足够相似到将正常希望它们的使用可交换的“Type”的两个实例间定义。为了给出“足够相似”的精确意义,本条规定一系列应用于每个“Type”实例的转换为那些“Type”实例产生正常形式。如果(且只有)两个“Type”实例,当它们的正常形式是相同词项的相同有序列表时,则定义两个“Type”实例是相同类型定义(见第11章)。
B.3.2在ASN.1规范中的每个“Type”事件是第11章中定义的词项的有序列表。通过以那样的顺序应用B.3.2.1至B.3.2.6中定义的转换可获得正常形式。
B.3.2.1 删去所有的注解(见11.6)。
B.3.2.2下面的转换不递归,因此,只需要以任意顺序应用一次:
a) 对于由“ValueSetTypeAssignment”定义的类型,其定义由“TypeAssignment”用如15.6中规定的“ValueSet”内容的、相同的“Type”和子类型约束代替;
b)对于每个整数类型:“NamedNumberList”(见18.1),如果有的话,重新排序以便“identifier”按字母表顺序排列(“a”开头,“z”最后);
c)对于每个枚举类型:如19.3中的规定,数字增加到是“identifier"(没有数字)的任意“Enumera-
tionltem”(见19.1);然后,“RootEnumeration"重新排序以便entifier"按字母表顺序排列 (“a“开头,“z”最后)
d)对于每个bitstring类型;“NamedBitList"(见21.1),如果有的话,重新排序以便“identifier”按字母表顺序排列(“a”开头,“z”最后)}
e)对于每个客体标识符值:每个“ObjldComponent”转换成它对应的、符合第31章语义的“NumberForm”(见31.12中的示例);
f)对于每个相对客体标识符值(见32.3):每个“RelativeOIDComponent”转换成它对应的、符合第32章语义的“NumberForm”}
g) 对于序列类型(见第24章)和集合类型(见第26章):形式“ExtensionAndException”、“ExtensionAdditions”的任何扩展被切割并粘贴到“ComponentTypeLists"的尾部;删去“OptionalExtensionMarker",如果出现的话。
如果“TagDefault”是IMPLICIT TAGS,关键字IMPLICIT被加到“Tag”的所有实例上(见第30章),除非有下面情况之一:
·它已经出现;或
· 出现保留字EXPLICIT,或
·被标记的类型是CHOICE类型;或
·它是开放类型。
如果“TagDefauh”是AUTOMATIC TAGS.根据24.2来决定是否应用自动标记(自动加标记将在后面进行)。
注。在24.3和26.2中规定,作为替换。Component of Type”的结果插入的“ComponentType”中出现的“Tag”本身不阻止自动加标记转换.
如果“ExtensionDefault”是EXTENSIBILITY IMPLIED,若没有出现省略号(“…”)的话,则在“ComponentTypeLists”后加上}
h) 对于选择类型(见第28章):“RootAhernativeTypeList"重新排序以便q NameType"的标识符按字母表顺序排列(“a”开头,“z”最后)。“OptionalExtensionMarker”,如果出现的话,被删去。如果“TagDefault”是IMPLICIT TAGS,关键字IMPLICIT被加到“Tags"的所有实例上(见第30章),除非有下面情况之一:
·它已经出现I或
· 出现保留字EXPLICIT;或
·被标记的类型是CHOICE类型;或
·它是开放类型。
如果“TagDefauh”是AUTOMATIC TAGS,根据28.5来决定是否应用自动标记(自动加标记将在后面进行)。如果“ExtensionDdault”是EXTENSIBILITY IMPLIED,若没有出现省略号(“…”)的话,则在“ComponentTypeLists"后加上。
B.3.2.3 以规定的顺序递归地应用下面的转换直至达到固定点:
a) 对每个客体标识符值(见31.3)l如果值定义以“DefinedValue”开头,则“DefinedValue”用它的定义代替;
b)对每个相对客体标识符值(见32.3):如果值定义包含“DefinedValue”,则“DefinedValue"用它们的定义代替;
c) 对于序列类型和集合类型。按照第24章和26章转换所有的“COMPONENT OF Type”实例(见第24章);
d)对于序列、集合和选择类型:如果它较早就决定自动加标记(见B.3.2.2 9)和h)),根据第24章、26章和28章应用自动加标记;
e)对于精选类型:结构按照第29章用选择的替换项代替l
f) 按照下面的规则,所有类型引用由它们的定义代替:
·如果代替的类型是引用正被转换的类型,类型引用用只与除某项本身外无其他项相匹配的特定项代替
·如果代替的类型是单一序列类型或单一集合类型,约束紧接在被替代类型的后面,如果有的话,移到关键字OF的前面;
·如果被代替的类型是参数化类型或参数化值集合(见GB/T 16262.4的8.2).则每个“DummyReference”用对应的“AetualParameter”替代。
g)所有的值引用由它们的定义替代l如果被替代的值是参数化值(GB/T 16262.4的8.2),则每个“DummyReferenee”用对应的“ActualParameter”替代。
注.替代任意值引用之前,应该应用本附录的规程以保证值引用通过值映射或直接地标识其支配类塑中的值.
B.3.2.4对于集合类型:“RootComponentTypeList”重新排序以便“ComponentType”按字母表顺序排列(“a"开头,“z”最后)。
B.3.2.5应该将下面的转换应用到值定义上
a)如果用标识符定义整数值,则用相关的数字替代那个标识符;
b)如果用标识符定义位串值,则用删去所有结尾0位的对应“bstring一替代
c) 删去“estring”中每个紧连换行(包括换行)前后的所有空白}
d) 删去“bstring”和“hstring”中的所有空白;
e)规格化用底数2定义的每个实数值以使尾数是奇数,规格化用底数10定义的每个实数值以使尾数最后的数字不是0;
f) 每个GeneralizedTime和UTCTime值用符合DER和CER中编码时采用的规则串替代(见GB/T 16263.1的11.7和11.8);
g) 应用c)之后,每个UTF8String、NumerieString、PrintableString、IA5String、VisibleString
(GB/T 1988String)、BMPString和UniveraslString值用以“四元组悖记法书写的UniversalString类型的相当值替代(见37.8)。
B.3.2.6 任何“realnumber”事件应转换成以10为“base“的相关“SequenceValue"。任何与“SequenceVaiue,,相关的“RealValue"事件应转换成相同“base,’的相关“SequenceValue",以使尾数的最后数字不是O。
B.3.3如果两个“Type”实例,当转换成它们的正常形式时,是词项的相同列表(见第11章),那么,定义两个“Type”实例为相同类型定义,但下列除外:如果“objectclassreference”(见GB/T 16262.2的7.1),“objectreferenee”(见GB/T 16262.2的7.2)或“objectsetreferenee”(见GB/T 16262.2的7.3)出现在“Type”的规格化形式内,那么,这两个类型没有定义为相同类型定义,而且它们之间将不存在值映射(见B.4)。
注:插入该例外是避免需要为关于信息客体类别、信息客体和信息客体集记法的语法元素提供正常形式的转换规则。类似地,这时还不包括规格化所有值记法和集算法记法的规范。如果要证明是该规范的需求,可在本部分的将来版本中提供。引入相同类型定义和值映射的概念以保证可以通过采用引用名或通过复制文本来使用简单的ASN.1结构,不必为更复杂的包括信息客体类别等的“Type”实例提供这一功能。
B.4值映射规范
B.4.1 如果“Type”的两个事件是B.3规则下的相同类型定义,那么,一个类型的每个值与另一个类型对应值之间存在值映射。
B.4.2对于通过加标记(见第30章),从任意类型X2产生的类型X1,.X1的所有成员与X2的对应成员之间定义为存在值映射。
注;当上面B.4.2中X1与X2的值之间,以及B.4.3中X3与X4的值之间定义存在值映射时,如果这种类型嵌入到其他方面相同但不同类型定义(如,SEQUENCE或CHOICE类型定义)中,产生的类型定义(SEQUENCE或CHOICE类型)将不是相同类型定义,而且它们之间没有值映射.
B.4.3对于通过元素集结构或通过分成子类型、并通过从任意支配类型X4选择值产生的类型X3.新类型成员和由元素集或分成子类型结构选择的支配类型的那些成员之间被定义为存在值映射。有无扩展标志出现不影响这一规则。
B.4.4在B.5中规定了某些字符串类型之间的附加值映射。
B.4.5定义为已命名值的整数类型的任意类型的所有值与定义为无已命名值、或有不同已命名值、或已命名值不同名称、或两者都有的任意整数类型之间被定义为存在值映射
注:值映射的存在不影响使用已命名值名称的任何范围规则要求。它们只能用于由在其中定义了它们的类型、或那个类型的类型引用名支配的范围中.
B.4.6定义为已命名位的位串类型的任意类型的所有值与定义无已命名位、或有不同已命名位、或已命名位不同名称、或两者都有的任意位串类型之间被定义为存在值映射。
注.值映射的存在不影响使用已命名位名称的任何范围规刚要求,它只能用于由在其中定义了它们的类型、或那个类型的类型引用名支配的范围中.
B.5为字符串类型定义的附加值映射
B.5.1 有两组受约束的字符串类型.A组(见B.5.2)和B组(见B.5.3)。A组中所有类型之间被定义为存在值映射,而且当由其他类型之一支配时,可以使用这些类型值的值引用。对于B组中的类型,这些不同类型之间从不会存在值映射,A组中的任意类型和B组中的任意类型之间也不会存在值映射.
B.5.2 A组组成成分:
UTF8String
NumericString
PrintableString
IA5String
VisibleString(GB/T 1988String)
UniversalString
BMPString
B.5.3 B组组成成分:
TeletexString(T61 String)
VideotexString
GraphicString
GeneralString
B.5.4将每种类型的字符串值与UniversalString映射来规定A组中的值映射,然后采用值映射的传递性特性。为了将来自A组类型之一的值映射到UniversalString.串用相同长度、每个字符按如下规定映射的UniversalString替代。
B.5.5形式上,UTF8String中的抽象值集是存在于UniversalString中但带不同标记的抽象值的相同集(见37.16),而且UTF8String中的每个抽象值被定义为与UniversalString中对应的抽象值映射。
B.5.6用于形成类型NumerieString和PrintableString的字符的图形字符(打印的字符形状)与分配给GB/T 13000.1的最初128个字符的图形字符的子集有可识别和无歧义的映射。使用图形字符的这种映射来定义这些类型的映射。
B.5.7通过将每个字符映射成具有如IA5String和VisibleString的BER编码值(8位)的Universal-String的BER编码中的相同(32位)值的UniversalString字符来把IA5String和VisibleString映射成UniversalString。
B.5.8 BMPString形式上是UniversalString的子集,而且对应的抽象值有值映射。
B.6特定类型和值兼容性要求
本章使用值映射概念来为某些ASN.1结构的合法性提供精确的文本。
B.6.1 具有支配类型Y的任何“Value”事件x-记法,标识在支配类型Y中的值y-val,该类型有一个到由X一记法规定的值x-val的值映射。要求有这样的值存在。
例如,考虑下面最后一行中的x事件;
X l l=[0] INTEGER (0.. 30) .
x X-:=29
Ytt=['l] INTEGER (25.. 35) .
Zlt,=Y(x l 30)
这些ASN.1结构是合法的,在最后的赋值中x-记法x引用X中的x-val 29,并且通过值映射标识Y中的y-val 29。r记法30引用Y中的y-val 30,同时Z1是值29和30的集合。另一方面,赋值:
Z2::=Y(x I 20)
是非法的,因为没有x-记法20能引用的y-val。
B.6.2任何“Type”事件,具有支配类型V的t一记法,标识与“Type”类型t一记法根中任意值有值映射的支配类型V根中值的完整集合。要求该集合至少含有一个值。
例如,考虑下面最后一行中的W事件:
V::=[OJINTEGER (0.. 30)
W:;=[I]INTEGER (25.. 35)
Y::=[2]INTEGER (31.. 35)
ZI::=V(W I 24)
W贡献值25-30给集算法导致Zt具有值24-30。另一方面,赋值:
Z2I.=V(Y l 24)是非法的,因为Y中没有与V中值映射的值。
B.6.3作为实际参数提供的任何值的类型要求从那个值到支配虚拟参数的类型中的值之一有值映射,而且,它是那个被标识的支配类型的值。
B.6.4如果“Type”作为是值集虚拟参数的虚拟参数的实际参数提供,那么那个“Type”的所有值要求与值集虚拟参数的支配者中的值具有值映射。实际参数选择与“Type”有映射的支配者中值的全部集.
B.6.5在规定是值或值集参数的虚拟参数的类型A中,除非对A的所有值及对赋值右边使用A的每个实例,A的那个值能合法地应用于虚拟参数的地方,否则,它是非法的规范。
B.7示例
B.7.1 本章提供说明B.3和B.4的示例。
B.7.2示例1
X::=SEQUENCE Xl::=SEQUENCE
{name VisibleString, {name VisibleString,
age INTEGER 一注解一
age INTEGER
X2,:=[8] SEQUENCE X3::=SEQUENCE
f name VisiMeString, {name VisibleString,
age INTEGER age AgeType)
AgeType::=INTEGER
X、XI、X2和X3都是相同类型定义。不能看到空白和注解的差别.X3中使用AgeType类型引用也不影响类型定义。然而,注意,如果序列元素的任何标识符改变,则类型将不再是相同定义,而且它们之间将没有值映射。
B.7.3示例2
B,, =-SET B1::=SET
{ name VisibleString, {age INTEGER,
age INTEGER} name VisibleString)
它们是相同类型定义并且限定于不是在模块头中有AUTOMATIC TAGS的模块中提供,否则它们不是相同类型定义,而且它们之间将没有值映射。能用CHOICE和ENUMERATED写出类似的示
例(用“Enumerationltem”的"identifier"形式)。
B.7.4示例3
C::=SET C1::=SET
{ name [0] VisibleString, (name VisibleString,
age INTEGER} age INTEGER (1.. 64))
它们不是相同类型定义,它们中的任一个与B或B1中的任一个也不是相同类型定义,而且e和C1的任何值之间没有值映射.它们中的任一个和B或B1中的任一个之间也没有值映射。
n.7.5示例4
x INTEGER{y(2))::=3
z INTEGER;;=x
是合法的,并且通过B.4.5中定义的值映射把值3赋给z。
B.7.6示侧5
bl BIT STRING:I='1011 B
b2 BIT STRING::一{version l(0),version 2(1),version 3(2)}::=bl
它们是合法的,并且把值{ version 1,version 3)赋给b2。
B.7.7示例6
根据B.I.I的定义,形式:
X DEFAULT y
的SEQUENCE元素是合法的,其中X是A、B、C、D、E或F中的任一个,或者是这些名称类型赋值右边的任意文本,而y是a.b、c、d、e或f中的任一个,下面例外:E DEFAULT y对于所有的a、b、c、d、f是非法的,而且,C DEFAULT e是非法的,因为在这些情况下,默认值引用到被默认的类型没有出现值映射。
附录C
(规范性附录)
指派的客体标识符值
本附录记录ASN.1系列标准中所赋的客体标识符和客体描述符值,并提供ASN.1模块以便在引用这些客体标识符值时使用。
C.1本部分中指派的客体标识符
本部分中赋予下面的值:
37.3条:
Object Identifer Value:
{joint-iso-itu-t asnl(1) specification(O) characterStrings(I) numerricString(O) }
Object Descriptor Value: " NumerieString ASN. 1Type"
3.5条:
Object Identifer Value.
{joint-iso-itu-t asnl(1) specification(O) modules(O) isoi0646(0) }
" PrintableString ASN. 1Type"
38.1条;
Object Identifer Value,
specification (0) characterStrings (i) printable.String(1)
" PrintableString ASN. 1Type"
C.2 ASN.1中的窖体标识符及其编码规则标准
本章规定对ASN.1标准(GB/T 16262.1至GB/T 16262.4,GB/T 16263.1至GB/T 16263.2,以及ISO/IEC 8825-3至ISO/IEC 8825-4)中定义的每个客体标识符值包含的值引用名定义的ASN.1模块。
注。这些值可用于OBJECT IDENTIFIER类型和其衍生的类型的值记法中.本章规定的模块中定义的全部值引用可输出和必须通过希望使用它们的任何模块引入。
ASNl-Object-Identifier-Module{ joint-iso-itu-t asnl(1) specification(0) modules(0)objectidentifier(1))
DEFINITIONS.:一BEGIN
—NumericString ASN.1类型(见37.3)--
numericString OBJECT IDENTIFIER ::=
{joint-iso-itu-t asnl(1) specification(0) characterStrings(1)numericString(0))
一PrintableString ASN.1类型(见37.5)-
printableString OBJECT IDENTIFIER::=
{joint-iso-itu-tasnl(1)specification(0)characterStrings(1)printableString(1))~ASN. 1Character Module(见38.1)--
asnlCharacterModule OBJECT IDENTIFIER::=
{joint-iso-itu-t asnl (1) specification(0)modules(0)is010646 (0))
一ASN. 10bject Identifer Module(本模块)一
asnlObjectldenti{erModule OBJECT IDENTIFIER::=
{joint-iso-itu-t asnl (1) specification(0)modules(0)object-identifers(1))
一单个ASN.1类型的BER编码一
her OBJECT IDENTIFIER::=
{joint-iso-itu-t asnl (1) basic-encoding(1)
一单个ASN.1类型的CER编码一
cer OBJECT IDENTIFIER{:=
{joint-iso-itu-t asnl(1) ber-derived(2)canonical-encoding(0))
一单个ASN.1类型的DER编码一
der OBJECT IDENTIFIER::=
{joint-iso-itu-t asnl(1) ber-derived(2)distinguished-encoding(1)}
一单个ASN.1类型的PER编码(基本对齐)一
perBasicAligned OBJECT IDENTIFIER::=
{joint-iso-itu-t asnl(1) packed-encoding(3)basic(0)aligned(0))
一单个ASN.1类型的PER编码(基本非对齐)一
perBasicUnaligned OBJECT IDENTIFIER::=
{joint-iso-itu-t asnl(1) packed-encoding(3)basic(0)unaligned(1))
一单个ASN.1类型的PER编码(正则对齐)一
perCanonicalAligned OBJECT IDENTIFIER::=
{joint-iso-itu-t asnl(1)packed-encoding(3)canonical(1)aligned(0))
一单个ASN.+1类型的PER编码(正则非对齐)一
perCanonicalUnaligned OBJECT IDENTIFIER;l=
{joint-iso-itu-t asni (1) packed-encoding(3)canonical(1)unaligned(1)
一单个ASN.1类型的XER编码(基本)一
xerBasic OBJECT IDENTIFIER::=
一单个ASN.1类型的XER编码(正则)一
xerCanonical OBJECT IDENTIFIER::=
正则(1))END-- ASNl-Object-Identifier-Module—
附 录D
(资料性附录)
给客体标识符成分赋值
本附录描述客体描述符注册树的顶级弧。没有解释怎样增加新弧,也不解释注册权威机构应该遵循的规则。它们在GB/T 17969.1中规定。
D.1 客体标识符成分值的根赋值
D.1.1从根节点开始规定了3条孤。值和标识符的赋值,以及随后成分值赋值的权威机构如下:
值 标识符 随后赋值权威机构
O itu-t ITU-T(见D.2)
L iso ISO(见D.3)
2 joint-iso-itu-t 见D.4
D.1.2按上面赋值的标识符itu-t、iso和joint-iso-itu-t,每个可用作为“NameForm”(见31.3)。
D.I.3标识符ccitt和joint-iso-ccitt分别与itu-t和joint-iso-itu-t同义,因此可以在客体标识符值中出现。
D.2客体标识符成分值的ITU-T赋值
D.2.1从itu-t标识的节点开始规定了5条弧。值和标识符的赋值是:
值 标识符 子序列赋值权威机构
O recommendation 见D.2.2
1 question 见D.2.3
2 administration 见D.2.4
3 network-operator 见D.L5
4 identified-organization 见D.2,6
这些标识符可用作为“NameForm"(见31.3)。
D.2.2 在recommendation下的弧具有带赋予的标识符a至z的值1至26。它们下的弧具有由字母标识的序列中ITU-T(和CCITT)标准的数字。其下的弧根据需要由ITU-T(和CCITT)标准确定。标识符a至z可用作为"NameForm"。
D.2.3在question下的弧有研究期间批准的、对应ITU-T研究组的值。该值由公式计算:
study group number(研究组号)+(period* 32)
其中“period”对于1984--1988其值为O,对于1988--1992其值为1,等等,它与十进制数32相乘。
在每个研究组下的弧具有对应赋予那个研究组的问题的值。它下面的弧根据需要由指派研究问题的组确定(例如,工作方或特殊报告起草人组)。
D.2.4在administration下的弧有X. 121DCCs的值。它下面的弧根据需要由X.121DCC标识的国家的管理部门确定。
D.2.5在network-operator下的弧具有X.121DNICs的值。它下面的弧根据需要由X.121DNIC标识的ROA或管理部门确定。
D.2.6在identified-organization下的弧是ITU通信标准局(TSB)赋予的值。它下面的弧根据需要由ITU值标识的组织确定。
注:可能发现这条弧有用的组织包括:
——不运营公共数据网络的认可的运营机构
——科学和工业组织
——地区标准组织;和
——多国组织。
D.3客体标识符成分值的ISO赋值
D.3.1 从“iso”标识的节点开始规定了三条弧。值和标识符的赋值是:
值 标识符 子序列赋值权威机构
0 standard 见D.3.2
2 member-body 见D.3.3
3 identified-organization 见D.3.4
这些标识符可用作为‘‘NameForm”(见31.3)。
注:已经撤销使用弧registration-authoriw(1).
D.3.2在每个standard下的弧应该有国际标准号的值。在国际标准是多部分时,部分号后面应该有附加弧,除非特殊情况下它不包括在国际标准中。进一步的弧应该具有如那个国际标准中定义的值。
D.3.3紧接member-body下的弧应该有三位数字的国家代码的值,正如GB/T 2659中规定的,标识那个国家的ISO国家委员会。不允许在这些标识符上有客体标识符成分的"NameFOrm”。
D.3.4紧接identified-organization下面的弧应该具有注册权威机构为SJ/Z 9090--1987分配的、标识那个权威机构像分配客体标识符成分一样特别注册的发布组织的国际代码指定者(ICD)值。紧接ICD下面的弧应该有符合sj/z 9090--1987的发布组织分配的"organization code"值。
D.4客体标识符成分值的联合赋值
D.4.1 根据GB/T 17969.3,在joint-iso-itu-t下的弧有时由ISOIIEC和ITU-T建立登记权威机构赋予和同意的值来标识联合ISOIIECI ITU-T标准机构的领域.
附录E
(资料性附录)
举例和提示
本附录包含描述(假定)数据结构中采用ASN.1的示例。它也包含有使用ASN.1各种特性的提示或指南.除非另有说明,否则假设是AUTOMATIC TAGS环境.
E.1 人事记录的示例
用一个简单、假设的人事记录来说明ASN.1的用法。
E.1.1 人事记录的非形式描述
人事记录的结构和某个特定个人的值如下所示:
Name: John P Smith
Title Director
Employee Number: 51
Date of Hire:+ 1971年9月17日
Name of Spouse: Mary T Smith
Number of Children, 2
Child Information
Name: Ralph T Smith
Dat~ of Birth 1957年11月11日
Child Information
Namel. Susan B Jones
Date of Birth 1959年7月17日
E.1.2记录结构的ASN.1描述
下面使用数据类型的标准记法形式地描述每个人事记录的结构。
PersonnelReeord::=[APPLICATION 0] SET
{name
title
number
dateOfHire
nameOfSpouse
children
Name,
VisibleString,
EmployeeNumber
Date,
Name,
SEQUENCE OF Childlnformation DEFAULT { }
}
Childlnformation. : = SET
( name Name,
dateOfBirth Date
}
Name::= [APPLICATION l] SEQUENCE
{ givenName VisibleString,
initial VisibleString,
familyName VisibleString
EmployeeNumber::=-APPLICATION 2]INTEGER
Date::=[APPLICATION 33 VisibleString ~YYYY MMDD -
本例说明了ASN.1语法分析的一个方面。语法结构DEFAULT只能适用于SEQUENCE或SET成分,它不能适用于SEQUENCE OF的元素。因此,在PersonnelRecord中的DEFAULT{)适用于children,而不适用于Childlnformation,
E.1.3记录值的ASN.1描述
下面使用数据值的标准记法形式地描述John Smith的个人记录值。
( name {givenName "John", initial”P", familyName "Smith"),
Title " Director",
number 51,
dateOfHire " 19710917"
nameOfSpouse {givenName " Mary", initial " T" lamilyName " Smith"},
children
{name { givenName "Ralph", initial "T" "familyName Smith"t,
dateOfBirth " 19571111" },
{ name{ givenName " Susan", initial " B" familyName " Jones"),
dateOfBirth " 19590717"}
)
)
或者以XLM值记法:
person. :
<PersonnelRecord >
<name>
< givenName >John</givenName >
< initial >P</ initial >
< familyName >Smith</familyName >
</name >
<title> Director</title>
<number>51</number>
< dateOfHire >19710917</dateOfHire >
<nameOfSpouse>
< givenName >Mary</givenName >
< initial >T</ initial >
< familyName >Smith</familyName >
</nameOfSpouse>
<children>
<Childlnformation>
< name >
< givenName >Ralph</givenName >
< initial >T~/initial >
< familyName >Smith</familyName >
</name >
< dateOfBirth >19571111</dateOfBirth >
<Childlnformation>
<ChildInformation>
<name>
givenName>Susan/givenName
< initial>B/initial
familyName>Jones/familyName
</name>
dateOfBirth>19590717/dateOfBirth
/ChildInformation>
</children>
</PersonnelReeord>
本部分定义的数据类型及形式记法是灵活的,可广泛地用于各种协议的描述。然而,这种灵活性有时会带来混淆,尤其是在第一次用这个记法时。本附录通过给出使用记法的指南和示例,意于将混淆减到最少。对于每个固有数据类型,提供了一个或多个使用指南。这里不考虑字符串类型(如。Visible-String)和第41至43章定义的类型。
E.2.1 布尔
E.2. 1.1用布尔类型为逻辑(即:双态)变量值建模,例如,是否问题的答案。
例:
Employed::=BOOLEAN
E.2. 1.2当赋给布尔类型引用名称时,选择描述true状态的那个。
例:
Married l l=BOOLEAN
而不是
MaritalStatus.::z BOOLEAN
E.2.2整数
E.2.2.1用整数类型为坐标或整数变量的值(为满足通用性而不限界)建模。
例。
CheekingAecountBalance l I=INTEGER 一精确到分;负为超支。
balance CheckingAccountBalance::=O
Balance::=<CheckingAecountBalance >0</CheckingAccountBalance>
E.2.2.2定义整数类型有名数字的最小和最大允许值。
例:
DayOfTheMonth::一INTEGER{first(l), last(31))
today DayOfTheMonth::=first
unknown DayOfTheMonth::z O
today=:=< DayOfTheMonth ><first/></DayOfTheMonth>
unknown.:=<DayOfTheMonth ></DayOfTheMonth>
注意,选择有名数字first和last是因为他们对于读者语法的重要性,并且不排除有其他可能小于1、大于31或在1与31之间的DayOfTheMonth的可能性。
要限制DayOfTheMonth的值刚好是first和last,它应该写作:
DayOfTheMonth::=INTEGER {first(l), last(31) )(first l last)
以及要限制DayOfTheMonth的值在1与31(含)之间的所有值,它应该写作:
DayOfTheMonth::一INTEGER {first(l), last(31) )(first,.last)
dayOfTheMonth DayOfTheMonth::=4
dayOfTheMonth;l=<DayOfTheMonth >4</DayOfTheMonth>
E.2.3枚举
E.2.3.1用枚举类型为有不少于三个状态的变量值建模。如果它们仅有的约束是不同的,则从零开始赋值。
例:
DayOfrheWeek t:= ENUMERATED {sunday(0), monday(1), tuesday(2), wednesday(3),
thursday(4), friday(5), saturday(6),}
firstDay DayOfTheWeek::=sunday
firstDay::一<DayOfTheWeek ><sunday/></DayOfTheWeek> ’
注意,由于他们对读者语义的重要性,在选择枚举sunday、monday等等时.DayOfTheWeek限制为假设这些值之一且没有其他值。另外,只有名称sunday、monday等等能赋给值l不允许有相当的整数值。
E.2.3.2用可扩展的枚举类型为变量值建模,变量值在目前只有两个状态、但是在协议的今后版本中可能有附加状态。
例:
MaritalStatus::一ENUMERATED{ single,married} - MaritalStatus第一版在下列预料中
MaritalStatus l:=ENUMERATED{single,married,…,widowed)一-MaritalStatus第二版今后还有:
MaritalStatus::=ENUMERATED{single,married,…,widowed,divorced) 一MaritalStatus第三版
E.2.4实数
E.2.4.1用实数类型为大约数目建模。
例:
AnglelnRadian l:=REAL
piREAL::={mantissa 3141592653589793238462643383279, basel0,exponent-30)
或者用实数的替换值记法:
pi REAL::=3.14159265358979323846264338327
pi::=
<REAL>
3. 14159265358979323846264338327
</REAL>
E.2.4.2应用设计者可能希望保证与实数值全部互工作,尽管在浮点硬件中不同,而且在实现决定中为应用使用(例如)单个或双倍长度浮点。它能通过下面实现:
App-X-Real=:--REAL (WITH COMPONENTS{
mantissa (-16777215.. 16777215),
base (2),
exponent (-125..128)})
|*
发送者不应该传输这些范围之外的值,而且合格的接受者应能够接受和处理这些范围内的值。
*|
girth App-X-Real::={mantissa 16, base 2,exponent l)
girth ::=
<App-X-Real>
32
</App-X-Rea|>
E.2.5位串
E.2.5.1 用位串类型为没有规定格式和长度,或者在其他地方规定,而且其位的长度不必是8的整数倍的二进制数据建模。
例:
G3FacsimilePage::一BIT STRING
一符合ITU-T T.4建议的位序列。
image G3FacsimilePage::=100110100100001110110'B
trailer BIT STRING::= '0193456789ABCDEF'H
bodyl G3FaesimilePage::= 'll01'B
body2 G3FacsimilePage::= all01000'B
Image::= <G3Facsimile>100110100100001110110</G3 Facsimile>
Traile::=
<BIT= STRING>
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011
1100 1101 1110 1111
</BI1 STRING>
bodyl I l=<G3Fcsimile >1101</G3 Facsimile>
body2::=<G3Facstmile >ll01000</G3Facsimile>
注意,因为结尾0位很重要(由于G3FacsimilePage的定义中没有拜NamedBitList),因此,“bodyl"
和“body2"是不同的抽象值。
E.2.5.2用有大小约束的位串类型为固定的依大小排歹Ij的位字段的值建模。
例l
BitField, i=BIT STRING (SIZE (12))
mapl BitField::='100110100100'B
map2 BitFieId2 l='9A4'H
map3 BitField: 1= '1001101001'B一非法的——与大小约束冲突。
mapl::=<BitField>100110100100</Bit Field>
注意,“mapl”和“map2"是相同的抽象值,因为“map2”的四个结尾位没有意义。
E.2.5.3用位串类型为bit map值建模’bit map是指明是否为每个对应的客体有序集合保持特定条件的逻辑变量的有序集合。
DaysOfTheWeek::=BIT STRING{
sunday(0), monday(I), tuesday(2), wednesday(3),
thursday(4), friday(S), saturday(6)} (SIZE (0.. 7))
sunnyDaysLastWeekl DaysOfTheWeek::={sunday, monday,wednesday}
sunnyDaysLastWeek2 DaysOfTheWeek::=’1101'B
sunnyDaysLastWeek3 DaysOfTheWeek::=’1101000'B
sunnyDaysLastWeek4 DaysOfTheWeek::=’11010000'B 一非法的
sunnyDaysLastWeekl::一
< DaysOfTheWeek>
<sunday/><monday/><wednesday/>
< DaysOlTheWeek>
sunnyDaysLastWeek2:.一<DaysOfTheWeek >1101</DaysOfTheWeek>
sunnyDaysLastWeek3~==<DaysOfTheWeek >1101000</DaysOfTheWeek>
注意,如果位串值的长度小于7位,那么丢失的位指明那些天为阴天,也就是上面的最初三个值有相同的抽象值。
E.2.5.4用位串类型为bit map值建模,是指明是否为每个对应的客体有序集合保持特定条件的逻辑变量的固定大小的有序集合。
DaysOfTheWeek}:=BIT STRING{
sunday(0), monday(l), tuesday(2), wednesday(3),
thursday(4), friday(5), saturday(6)) (SIZE (7))
sunnyDaysLastWeekl DaysOfTheWeek:1={sunday,monday, wednesday)
sunnyDaysLastWeek2 DaysOfTheWeek::=’1101'B一非法的——与大小约束冲突
sunnyDaysLastWeek3 DaysOtTheWeek:;=’1101000'B
sunnyDaysLastWeek4 DaysOfTheWeek::一’11010000'B一非法的——与大小约束冲突
注意,第一个和第三个值有相同的抽象值.
E.2.5.5用带已命名位的位串类型为相关逻辑变量集合的值建模。
例:
PersonalStatus::=BIT STRING
{married(0),employed(1),veteran(2),collegeGraduate(3))
billClinton PersonalStatus::={married,employed,collegeGraduate)
hillaryClinton PersonalStatus::=’110100'B
hillClinton::=
< PersonalStatus>
<married/>
<employed/>
<coUegeGraduate/>
</PersonalStatus>
hillaryClinton::=<PersonalStatus>110100</PersonalStatus>
注意,"billClinton”和“hiUaryClinton”有相同的抽象值。
E.2.6八位位组串
E.2.6.1用八位位组串类型为没有规定格式和长度,或者在其他地方规定,而且其位的长度是8的整
数倍的二进制数据建模。
例:
G4FacsimileImage::=OCTET STRING
一符合ITU-T T.5和ITU-T T.6建议的八位位组序列。
image G4FacsimilePage.:=’3FE2EBAD471005'B
image,,=<G4FacsimileImage >3FE2EBAD471005</G4Facsimilelmage>
E.2.6.2在有合适的受限制字符串类型时,优先用它而不用八位位组串类型。
例:,
Surname::==PrintableString
president Surname::一¨Clinton"
president.:=<Surname>Clinton</Surname>
E. 2.7 UniversalString,BMPString和UTF8String
用BMPString类型或UTF8String类型来为只由取自GB/T 13000.1基本多文种平面(BMP)的字符组成的任何信息串建模,而UniversalString或UTF8String则为由不属于BMP的GB/T 13000.1字符构成的任何串建模。
E.2.7.1 用Level1或Level2指明实现级数对使用组合字符的限制。
例:
RussianName.:=Cyrillic(Levell)
一RussianName用无组合字符。
SaudiName::= BasieArabic(SIZE (1.. 100) ‘Level2)
一SaudiName用组合字符的子集。
乏的表达式:
greekCapitalLetterSigma BMPString::={0,O,3,163}
greekCapitalLetterSigma::=<BMPString>Σ</BMPString>
串“f→∝”的表达式:
rightwardsArrow UTF8String::={O,O,33, 146)
infinity UTFSString::={O,O,34, 30)
property UTF8String::={"f", rightwardsArrow,” ",infinity}
property::=<UTF8String>f&#x2192;∞</UTF8String>
E.2.7.2通过使用“UnionMark”(见第46章),集合可扩大成选择的子集(即:包擅BASIC LATIN集合中的所有字符)。
例:
KatakanaAndBasicLatin..-- UniversalString(FROM (Katakana I BasicLatin))
E.2.8 CHARACTER STRING
用无限制字符串类型来为不能用受限制字符串类型之一建模的任何信息串建模。确保规定了字符汇和八位位组代码。
例:
PackedBCDString.:=CHARACTER STRING(WITH COMPONENTS{
identification (WITH COMPONENTS {
fixed PRESENT})
/*抽象和传送语法应该是下面定义的PackedBCDString-Absu:actSyntaxld
和PackedBCDString-TransferSyntaxld.
*|
))
/*字母为数字0至9的字符抽象语法(字符集)的客体标识符值.
*|
PackedBCDString-AbstraetSyntaxld OBJECT IDENTIFIER:1:
{joint-iso-itu-t asnl(1) examples(123) PackedBCD(2) charSet(0) )
/*每八位位组紧缩两位数字,每位数字编码为0000至1001,1111:用作填充的字符传送语法的客体标识符值。
*|
PackedBCDString-TransferSyntaxld OBJECT IDENTlFIERz::=
{joint-iso-itu-tasnl(1) examples(123) PackedBCD(2) characterTransferSyntax(1))
/* PackedBCDString的编码将只包含字符的已定义编码,有任意必需长的字段,以及在BER时,携带标记的字段。当“fixed”已规定时,不携带客体标识符值。
*|
PackedBCDString- AbstractSyntaxld::=
<OBJECT_IDENTIFIER>
joint-iso-itu-t, asnl (1). examples(123), packedBCD(2), charSet(0)
</OBJECT_ IDENTIFIER>
packedBCDString-TransferSyntaxld::=
<OBJECT_IDENTIFIER>
joint-iso-itu-t, asnl (1). examples(123), packedBCD(2). CharacterTransferSyntax(1)
</OBJECT_IDENTIFIER>
或者
packedBCDString- AbstractSyntaxld::=
<OBJECT_IDENTIFIER>2. 1.123.2.O</OBJECT -IDENTIFIER>
packedBCDString-Transfer~yntaxld::=
<OBJECT_IDENTIFIER>2.1.123.2. I</OBJECT_IDENTIFIER>
注一编码规则不必将类型CHARACTER STRING的值编码成总是包含客体标识符值的形式,尽管它们保证编码中保留抽象值。
E.2.9空
用空类型来指明序列成分的有效缺失。
例:
Patientldentifier::一SEQUENCE{
name VisibleString,
roomNumber CHOICE{
room INTEGER,
outPatient NULL -如果一个门诊病人一
)
)
lastPatient Patientldentifier~l={
name "Jane Doe"
roomNumber outpatient: NULL
}
lastPatient:1 2
< PatientIdentifier>
<name>Jane Doe</name>
GB/T 16262.1--2006/150/1EC 8824-1 = 2002
<roomNumber><outPatient/></roomNumber>
</Patientldentifier>
E.2.10序列和单一序列
E.2.10.1 用单一序列类型来为类型相同、数字大或不可预知、顺序有意义的变量集合建模。
例:
NamesOfMemberNations.:=SEQUENCE OF VisibleString
一一按字母表顺序
firstTwo NamesOfMemberNations..:={”Australia"," Austria")
或用可选标识符:
NamesOfMemberNations2 ::=SEQUENCE OF memberNation VisibleString
一按字母表顺序
firstTw02 NamesOfMemberNations2.:一
{ memberNation”Australia",memberNation "Austria"}
firstTwo 32
<NamesOfMemberNations>
< VisibleString>Australia </VisibleString>
< VisibleString>Austria </VisibhString>
</NamesOfMemberNations>’
firstTw02::=
< NamesOfMemberNations2>
< memberNation>Australia </memberNation>
< memberNation>Austria </memberNation>
</NamesOfMemberNations 2>
E.2. 10.2用序列类型来为类型相同、数字已知和适中、及顺序有意义的变量集合建模,只要集合的构成不可能从协议的一个版本改变到下一个。
例:
NamesOfOfficers::=SEQUENCE{
president VisibleString,
vicePresident VisibleString,
secretary VisibleString)
aemeCorp NamesOfOfficers::={
president ¨Jane Doe",
vicePresident
secretary
acmeCorpt,2
" John Doe",
" Joe Doe"}
< NamesOfOfficers>
< president >Jane Doe</president>
< vicePresident >John Doe</vicePresident>
< secretary >Joe Doe</secretary>
</NamesOfOfficers>
E.2:10.3用不可扩展的序列类型来为类型不同、数字已知和适中、顺序有意义的变量集合建模,只要集合的构成不可能从协议的一个版本改变到下一个。
例:
Credentials: l=SEQUENCE{
userName VisibleString,
password VisibleString,
accountNumber INTEGER)
E.2.10.4用可扩展序列类型来为顺序有意义、数字当前已知和适中但预计会增加的变量集合建模。
例:
Record::=SEQUENCE{ 一包含“Record”的协议的第一版
userName VisibleString,
password VisibleString,
accountNumber INTEGER,
…’
)
在预料中;
Record.:=SEQUENCE{ -包含“Record”的协议的第二版
userName VisibleString,
password VisibleString,
accountNumber INTEGER
…'
[[2:一协议第二版中增加的扩展附加
lastLoggedln GeneralizedTime OPTIONAL,
minutesLastLoggedln INTEGER
]].
)
且后来还有(没有附加到纪录的协议的第三版):
Record:.=SEQUENCE{ 一包含“Record"的协议的第三版
userName VisibleString,
password VisibleString,
aecountNumber INTEGER,
[[2;一协议第二版中增加的扩展附加
lastLoggedln GeneralizedTime OPTIONAL,
minutesLastLoggedIn INTEGER
]].
E[4: 一协议第三版中增加的扩展附加 一
certificate Certificate,
thumb ThumbPrint OPTIONAL
]],
)
E.2.11集合和单一集合
E.2.11.1用集合类型来为数字已知和适中且顺序无意义的变量集合建模。如果自动置标记无效,用如下所示的特殊上下文置标记来标识每个变量。(有自动置标记时,不必加标记。)
例:
UserName::=SET{
personalName [0] VisibleString,
organizationName [1] VisibhString,
countryName [2] VisibleString}
user UserName::={
countryName ”Nigeria”,
personalName “Jonas Maruba”,
organizationName “Meteorology, Ltd.”)
user l l 2
<UserName>
< countryName>Nigeria </countryName>
< personalName >Jonas Maruba</personalName>
< organizationName >Meteorology, Ltd.<organizationName>
</UserName>
E.2. 11.2用有OPTIONAL的集合类型来为数字已知和合理的小且顺序无意义的变量的另一个集的(正确或不正确)子集的变量集合建模。如果自动置标记无效,用如下所示的特殊上下文置标记来标识每个变量。(有自动置标记时,不必加标记。)
例
UserName..=SET{
personalName [o]ViSibleStri《,
organizationName [1] VisibhString OPTIONAL
一默认为当地组织的那个一
countryName [2] VisibleString OPTIONAL
一默认为当地国家的那个一}
E.2.11.3用可扩展集合类型来为构成可能从一个协议版本改变到下一个的变量集合建模。下面假设模块定义中规定了AUTOMATIC TAGS。
例
UserName::=SET{
personalName
organizationName
countryName
VisibleString,- "LIserNameV--
VisibleString OPTIONAL,
VisibleString OPTIONAL,
)
user userName::={personalName”Jonas Maruba")
user ::=
<: UserNarne
personalName :>Jonas Maruba<:/personaIName :>
</UserName
UserName::=SET{ 一一"UserName”第二版
personalName VisibleString,
organizationName VisibleString OPTIONAL,
countryName VisibleString OPTIONAL,
….
[[2 一协议第二版中增加的扩展附加
internetEmailAddress VisibleString,
hxNumber VisibleString OPTIONAL
]], .
...
}
user UserName::={ " Jonas Maruba",
personaIName " jonas@meteor, ngo. corn"
internetEmailAddress
)
User::=
<UserName>
< personalName >Jonas Maruba</personalName>
< internetEmailAddress >jonas@meteor. ngo. corn</internetEmailAddress>
<UserName>
且后来还有(没有附加到用户名的协议的第三和四版).
UserName::=SET( 一包含“UserName一的协议第五版
personalName VisibleString,
organizationName VisibhString OPTIONAL,
countryName VisibhString OPTIONAL,
…,
[[2 : .第二版中增加的扩展附加
internetEmailAddress VisibleString, .
faxNumber VisibleString OPTIONAL
]],
[[5: 一第五版中增加的扩展附加
phoneNumber VisibleString OPTIONAL
]],
)
user UserName::={
personalName
internetEmailAddress
)
" Jonas Maruba",
" jonas@meteor, ngo. corn"
user::=
< UserName>
< personalName >Jonas Maruba</personalName>
< internetEmailAddress >jonas@meteor.ngo. eom</internetEmailAddress>
</UserName>
E.2.11.4用单一集合类型来为类型相同和顺序无意义的变量集合建模。
例,
Keywords.:=SET OF VisibleString 一按任意顺序
someASNlKeywords Keywords::={”INTEGER",”BOOLEAN",”REAL")
或者采用可选标识符:
Keywords2, l=SET OF keyword VisibleString 一按任意顺序
someASNl Keywords2 Keywords2,:≈{keyword”INTEGER", keyword”BOOLEAN",
keyword "REAL")
someASNIKeywords::=
<Keywords>
< VisibleString>INTEGER</VisibleString>
< VisibleString>BOOLEAN</VisibleString>
<VisibleString>REAL</VisibleString>
</Keywords>
someASNlKeywords2::=
<Keywords2>
<keyword>INTEGER</keyword>
<keyword>BOOLEAN</keyword>
< keyword> REAL</keyword>
</Keywords2>
E.2.12已标记
介绍AUTOMATIC TAGS结构之前,ASN.1规范常常包含标记。下面各条描述典型应用置标记的方法。随着AUTOMATIC TAGS的介绍,新ASN.1规范不必采用标记记法,尽管那些修改旧记法可能使其本身与标记有关。鼓励ASN.1记法的新用户使用AUTOMATIC TAGS.因为,它使记法更可读。
E.2.12.1通用类别标记仅用于本部分内。提供记法[UNIVERSAL 30](示例)只是为了“UsefulTypes”(见41.1)的定义精确。它不应该用在其他地方。
E.2.12.2使用标记经常碰到的形式是在整个规范中分配应用层类别标记精确地一次,用它标识在规范内发现宽度、分散、用途的类型。也常常使用应用层类别标记(只有一次)来标记应用的最外CHOICE的类型,如果通过应用类别标标识个人信息。下面是前面情形的举例用法
例:
FileName=z=[APPLICATION 8] SEQUENCE{
direetoryName VisibleString,
directoryRelativeFileName VisibleString)
E.2. 12.3特定上下文置标记常常以代数方式应用于SET、SEQUENCE或者CHOICE的所有成分中。然而,要注意,AUTOMATIC TAGS设施为你轻松地完成这些。
例
CustomerRecord::=SET{
name 、 [0] VisibleString,
mailingAddress [1] VisibleString,
accountNumber [2]INTEGER,
balaneeDue [3] INTEGER-以分计一)
CustomerAttribute.:=CHOICE{
name [0] VisibleString,
mailingAddress [1] VisibleString,
aceountNumber [2] INTEGER,
balaneeDue [3] INTEGER-以分计一)
E.2.12.4专用类别置标记通常不应该用在国际标准化规范(尽管没有禁止这样做)。企业生产的应用通常使用应用层和特定上下文标记类别。然而,特定企业的规范试图扩大国际标准化规范可能是常见的情形,并且在这种情况下,采用专用类别标记可能会在部分地保护特定企业规范变化成国际标准化规范中获得一些利益。.
例l
AcmeBadgeNumber:.=[PRIVATE 2]INTEGER
badgeNumber AemeBadgeNumber.: =2345
1651