BooleanValue :: = TRUE | FALSE
18.1. Целочисленный тип (см. 3.8.40) должен указываться нотацией "IntegerType":
IntegerType :: =
INTEGER |
INTEGER "{" NamedNumberList "}"
NamedNumberList :: =
NamedNumber |
NamedNumberList "," NamedNumber
NamedNumber :: =
identifier "(" SignedNumber ")" |
identifier "(" DefinedValue ")"
SignedNumber :: = number | "-" number
18.3. "NamedNumberList" не является существенной составной частью определения типа. Эта последовательность используется только в нотации для значения, определенной в 18.9.
Примечание. Так как "identifier" не может использоваться для спецификации значения, связанного с "NamedNumber", то "DefinedValue" никогда не может быть ошибочно интерпретировано как "IntegerValue". Следовательно, в следующем случае
a INTEGER :: = 1
T1 :: = INTEGER{a(2)}
T2 :: = INTEGER{a(3), b(a)}
c T2 :: = b
d T2 :: = a
"c" обозначает значение 1, так как не может относится ни ко второму, ни к третьему появлению "a" в этом примере, а "d" обозначает значение 3.
18.5. Значения каждого из "SignedNumber" и "DefinedValue", входящего в "NamedNumberList", должны быть различными и представлять разные значения целочисленного типа.
18.6. Все "identifier", входящие в "NamedNumberList", должны быть различными.
18.7. Порядок последовательностей "NamedNumber" в "NamedNumberList" несущественен.
18.8. Типы, определенные этой нотацией, имеют тег универсального класса 2.
IntegerValue :: =
SignedNumber |
identifier
18.10. Идентификатор "identifier" в продукции "IntegerValue" должен быть одним из идентификаторов "identifier" в "IntegerType", с которым связано значение, и представляет соответствующее число.
Примечание. Когда указывается целочисленное значение, для которого был определен идентификатор "identifier", использование формы "identifier" для "IntegerValue" является предпочтительным.
19.1. Перечислимый тип (см. 3.8.24) должен указываться нотацией "EnumeratedType":
EnumeratedType :: =
ENUMERATED "{" Enumerations "}"
Enumerations :: = RootEnumeration |
RootEnumeration "," "..." |
RootEnumeration "," "..." "," AdditionalEnumeration
RootEnumeration :: = Enumeration
AdditionalEnumeration :: = Enumeration
Enumeration :: =
EnumerationItem | EnumerationItem "," Enumeration
EnumerationItem :: =
identifier | NamedNumber
Примечания
1. Каждое значение "EnumeratedType" имеет идентификатор, который связан с отличным от других целым числом. Однако не подразумевается, что само значение должно иметь какую-либо целочисленную семантику. Спецификация альтернативы "NamedNumber" для "EnumerationItem" обеспечивает управление представлением значения для облегчения совместимости выражений.
2. Численные значения внутри "NamedNumber" в "RootEnumeration" не обязательно должны быть упорядоченными или последовательными, а численные значения внутри "NamedNumber" в "AdditionalEnumeration" должны быть упорядоченными или, но не обязательно, последовательными.
19.2. Для каждой альтернативы "NamedNumber" идентификаторы "identifier" и "SignedNumber" должны отличаться от всех других "identifier" и "SignedNumber" в "Enumeration". Кроме того, для каждой "NamedNumber" выполняются положения 18.2 и 18.4.
19.3. Всем элементам перечисления "EnumerationItem" (в "EnumeratedType"), являющимся идентификаторами "identifier", последовательно присваиваются неотрицательные целые. Для этого последовательность целых начинается с 0, но из нее исключаются те, которые уже задействованы в элементах перечисления "EnumerationItem", являясь "NamedNumber".
Примечание. Целочисленные значения связываются с "EnumerationItem" для определения правил кодирования. В противном случае они не используются в спецификации АСН.1.
19.4. Значение каждого нового "EnumerationItem" должно быть больше, чем все ранее определенные "AdditionalEnumeration" в типе.
19.5. Когда "NamedNumber" используется в определяющем "EnumerationItem" в "AdditionalEnumeration", связанное с ним значение должно отличаться от значений всех ранее определенных "EnumerationItem" (в этом типе) независимо от того, встречаются ранее определенные "EnumerationItem" в корне перечисления или нет. Например:
A :: = ENUMERATED {a, b, ..., c(0)} - - недопустимо, т.к. 'a' и 'c' равны 0
B :: = ENUMERATED {a, b, ..., c, d(2)} - - недопустимо, т.к. 'c' и 'd' равны 2
C :: = ENUMERATED {a, b(3), ..., c(1)} - - допустимо, c = 1
D :: = ENUMERATED {a, b, ..., c(2)} - - допустимо, c = 2
19.6. Значение, связанное с первой альтернативой "EnumerationItem" в "AdditionalEnumeration", которая есть "identifier" (а не "NamedNumber"), должно быть наименьшим значением, для которого "EnumerationItem" не определен в "RootEnumeration", и все предшествующие "EnumerationItem" в "AdditionalEnumeration" (если они есть) должны быть меньше. Например являются допустимыми следующие записи:
A :: = ENUMERATED {a, b, ..., c} - - c = 2
B :: = ENUMERATED {a, b, c(0), ..., d} - - d = 3
C :: = ENUMERATED {a, b, ..., c(3), d} - - d = 4
D :: = ENUMERATED {a, z(25), ..., d} - - d = 1
19.7. Перечислимый тип имеет тег универсального класса 10.
19.8. Значение перечислимого типа должно определяться нотацией "EnumeratedValue":
EnumeratedValue :: = identifier
19.9. Идентификатор "identifier" в перечислимом значении "EnumeratedValue" должен быть равен значению "identifier" в последовательности "EnumeratedType", с которым оно связывается.
20.1. Действительный тип (см. 3.8.52) должен указываться нотацией "RealType":
RealType :: = REAL
20.2. Действительный тип имеет тег универсального класса 9.
20.3. Значениями действительного типа являются значения PLUS-INFINITY, MINUS-INFINITY и действительные числа, задаваемые следующей формулой, содержащей три целых числа - M, B и E:
где M - мантисса, B - основание, а E - показатель степени.
20.4. Действительный тип имеет ассоциированный тип, который используется для задания точности абстрактных значений действительного типа и обеспечения нотаций значений и подтипов действительного типа.
Примечание. Правилами кодирования может определяться другой тип, который используется для спецификации кодирования, или может быть задано кодирование без ссылки на ассоциированный тип. В частности, кодирование в BER и PER обеспечивает двоично-кодированное десятичное (BCD) кодирование, если основание равно 10, и кодирование, допускающее эффективное преобразование в машинное представление с плавающей точкой и обратно, если основание равно 2.
20.5. Ассоциированный тип для определения значения и подтипов есть (с обязательными комментариями):
SEQUENCE {
mantissa INTEGER,
base INTEGER (2|10),
exponent INTEGER
- - Ассоциированное математическое действительное число
- - есть "mantissa", умноженная на "base" в степени "exponent"
}
Примечания
1. Значения, представленные по основанию 2 и 10, рассматриваются как различные абстрактные значения, даже если их вычисление дает одно и то же действительное число, и могут иметь разную прикладную семантику.
2. Нотация "REAL (WITH COMPONENTS {..., base(10)})" может быть использована для ограничения множества значений по абстрактному основанию 10 (и, аналогично, - основанию 2).
3. Этот тип может предоставлять точное, конечное значение любого числа, которое может храниться в памяти машины с плавающей точкой, и любого числа с конечным символьно-десятичным представлением.
20.6. Значение действительного типа должно определяться нотацией "RealValue":
RealValue :: =
NumericRealValue | SpecialRealValue
NumericRealValue :: = 0
SequenceValue - - Значение ассоциированного типа
SpecialRealValue :: =
PLUS-INFINITY | MINUS-INFINITY
Форма "0" должна использоваться для нулевых значений, альтернативная форма "NumericRealValue" для нулевых значений использоваться не может.
21.1. Тип "битовая строка" (см. 3.8.6) должен указываться нотацией "BitStringType":
BitStringType :: =
BIT STRING
BIT STRING "{" NamedBitList "}"
NamedBitList :: =
NamedBit |
NamedBitList "," NamedBit
NamedBit :: =
identifier "(" number ")" |
identifier "(" DefinedValue ")"
21.2. Первый бит в битовой строке называется нулевым. Последний бит в битовой строке называется завершающим.
Примечание. Эта терминология используется в спецификации значения нотации и определении правил кодирования.
21.3. "DefinedValue" должно быть ссылкой на неотрицательное значение целочисленного типа.
21.4. Значения последовательностей "number" и "DefinedValue", появляющихся в списке поименованных битов "NamedBitList", должны быть попарно различными, и являются номерами различных битов в значении битовой строки.
21.5. Все идентификаторы "identifier", появляющиеся в "NamedBitList", должны быть различными.
Примечания
1. Порядок последовательностей продукций "NamedBit" в "NamedBitList" несущественен.
2. Так как "identifier", который появился в "NamedBitList", не может быть использован для спецификации значения, связанного с "NamedBit", то "DefinedValue" никогда не может быть ошибочно интерпретировано как "IntegerValue". Следовательно, в следующем случае:
a INTEGER :: = 1
T1 :: = INTEGER{a(2)}
T2 :: = BIT STRING {a(3), b(a)}
последнее появление "a" обозначает значение 1, которое не может быть указано ни при втором, ни при третьем появлении "a".
21.6. Присутствие "NamedBitList" не влияет на множество абстрактных значений этого типа. Значения, содержащие биты 1, отличные от поименованных битов, допускаются.
21.7. Когда список поименованных битов "NamedBitList" используется в определяющем типе битовой строки, правила кодирования АСН.1 могут добавлять (или убирать) произвольное число завершающих битов 0 к (или из) значениям(ий), которые кодируются или декодируются. Следовательно, проектировщики реализаций должны гарантировать, что различные семантики не связаны со значениями, различающимися только числом завершающих битов 0.
21.8. Этот тип имеет тег универсального класса 3.
21.9. Значение типа "битовая строка" должно определяться нотацией "BitStringValue":
BitStringValue :: =
bstring |
hstring |
"{" IdentifierList "}" |
"{" "}"
IdentifierList :: =
identifier |
IdentifierList "," identifier
21.10. Каждый из идентификаторов "identifier" в значении "BitStringValue" должен быть тем же самым, что и "identifier" в последовательности продукций "BitStringType", с которой связывается значение.
21.11. Нотация "BitStringValue" обозначает значение битовой строки с единицами в позициях, заданных номерами, соответствующими идентификаторам "identifier", и с нулями - в остальных позициях.
Примечание. Последовательность продукций "{" "}" используется для обозначения битовой строки, не содержащей ни одного бита.
21.12. При спецификации правил кодирования для битовой строки будут использованы термины "первый бит" и "завершающий бит", где первый бит есть нулевой бит (см. 21.2).
21.13. При использовании нотации "bstring" первый бит записывается слева, а завершающий бит - справа.
21.14. При использовании нотации "hstring" старший бит каждой шестнадцатеричной цифры соответствует левому биту в битовой строке.
Примечание. Эта нотация никоим образом не ограничивает способ размещения правилами кодирования битовой строки по октетам для передачи.
21.15. Нотация "hstring" может использоваться, если только значение битовой строки состоит из количества бит, кратного четырем.
Пример
'A98A'H
и
'1010100110001010'B
являются альтернативными обозначениями одного и того же значения битовой строки. Если тип был определен с использованием списка поименованных битов "NamedBitList", то (единственный) завершающий нуль не является частью значения, которое, таким образом, имеет длину 15 бит. Если тип был определен без "NamedBitList", то завершающий нуль является частью значения, которое имеет длину 16 бит.
22.1. Тип "строка октетов" (см. 3.8.48) должен указываться нотацией "OctetStringType":
OctetStringType :: = OCTET STRING
22.2. Этот тип имеет тег универсального класса 4.
22.3. Значение типа "строка октетов" должно определяться нотацией "OctetStringValue":
OctetStringValue :: =
bstring |
hstring
22.4. Для строк октетов при спецификации правил кодирования октеты указываются терминами "первый октет" и "завершающий октет", а для битов внутри октета - терминами "старший бит" и "младший бит".
22.5. При использовании нотации "bstring" самый левый бит является старшим битом первого октета. Если "bstring" состоит из количества бит, не кратного восьми, она должна интерпретироваться таким образом, как если бы она содержала дополнительные завершающие нули, которые сделают ее длину наименьшей из кратных восьми.
22.6. При использовании нотации "hstring" крайняя левая шестнадцатеричная цифра должна быть старшим полуоктетом первого октета.
22.7. Если "hstring" состоит из нечетного числа шестнадцатеричных цифр, то она должна интерпретироваться таким образом, как если бы она содержала еще одну дополнительную завершающую нулевую шестнадцатеричную цифру.
23.1. Вырожденный тип (см. 3.8.43) должен указываться нотацией "NullType":
NullType :: = NULL
23.2. Этот тип имеет тег универсального класса 5.
23.3. Значение вырожденного типа должно указываться нотацией "NullValue":
NullValue :: = NULL
24.1. Нотацией для определения типа "последовательность" (см. 3.8.56) должна быть "SequenceType":
SequenceType :: = SEQUENCE "{" "}" |
SEQUENCE "{" ExtensionAndException OptionalExtensionMarker "}" |
SEQUENCE "{" ComponentTypeLists "}"
ExtensionAndException :: = "..." | "..." ExceptionSpec
OptionalExtensionMarker :: = "," "..." | empty
ComponentTypeLists :: = RootComponentTypeList |
RootComponentTypeList "," ExtensionAndException ExtensionAdditions
OptionalExtensionMarker |
RootComponentTypeList "," ExtensionAndException ExtensionAdditions
ExtensionEndMarker"," RootComponentTypeList |
ExtensionAndException ExtensionAdditions ExtensionEndMarker ","
RootComponentTypeList
RootComponentTypeList :: = ComponentTypeList
ExtensionEndMarker :: = "," "..."
ExtensionAdditions :: = "," ExtensionAdditionList | empty
ExtensionAdditionList :: = ExtensionAddition | ExtensionAdditionList ","
ExtensionAddition
ExtensionAddition :: = ComponentType | ExtensionAdditionGroup
ExtensionAdditionGroup :: = "[[" ComponentTypeList "]]"
ComponentTypeList :: =
ComponentType |
ComponentTypeList "," ComponentType
ComponentType :: =
NamedType |
NamedType OPTIONAL |
NamedType DEFAULT Value |
COMPONENTS OF Type
24.2. Когда продукция "ComponentTypeLists" встречается в определении модуля, для которого выбрано автоматическое тегирование (см. 12.3), и никакой из экземпляров "NamedType" в любой из первых трех альтернатив для "ComponentType" не содержит "TaggedType", то преобразование автоматического тегирования выбрано для всего "ComponentTypeLists"; в противном случае - нет.
Примечания
1. Использование нотации "TaggedType" в определении списка компонентов для типа "последовательность" позволяет спецификатору управлять тегами в противоположность автоматическому присваиванию в методе автоматического тегирования. Следовательно, в следующем случае:
T :: = SEQUENCE { a INTEGER, b [1] BOOLEAN, c OCTET STRING }
автоматическое тегирование не применяется к списку компонентов a, b, c, даже если это определение типа "последовательность" T встретилось в модуле, для которого было выбрано автоматическое тегирование.
2. Только экземпляры продукции "ComponentTypeList", встретившиеся в модуле, для которого было выбрано автоматическое тегирование, являются кандидатами для преобразования автоматического тегирования.
24.3. Вопрос о применении преобразования автоматического тегирования решается индивидуально для каждого экземпляра списка "ComponentTypeLists" и до преобразования COMPONENTS OF, определенного в 24.4. Однако, как определено в 24.7 - 24.9, преобразование автоматического тегирования (если оно применяется) производится после преобразования COMPONENTS OF.
Примечание. В результате применение автоматических тегов подавляется тегами, явно присутствующими в "ComponentTypeLists", но не тегами, присутствующими в "Type", следующем за COMPONENTS OF.
24.4. Тип "Type" в нотации "COMPONENTS OF Type" должен быть типом "последовательность". Нотация "COMPONENTS OF Type" должна использоваться для определения включения, в этом месте списка компонентов, всех компонентов указанного типа, за исключением любых маркеров расширения и расширяющих дополнений, которые могут присутствовать в "Type". (В "COMPONENTS OF Type" включается только "RootComponentTypeList" типа "Type"; маркеры расширения и расширяющие дополнения, если они есть, игнорируются нотацией "COMPONENTS OF Type"). При этом преобразовании игнорируются все ограничения, применяемые к указываемому типу.
Примечание. Это преобразование логически завершается до удовлетворения требований последующих подразделов.
24.5. В каждом из последующих подразделов идентифицированы серии появлений "ComponentType" либо в корне, либо в расширяющих дополнениях, либо и в том, и в другом. Правило 24.5.1 должно применяться для всех таких серий.
24.5.1. Для каждой серии из одного или нескольких последовательных появлений типов компонентов "ComponentType", отмеченных как OPTIONAL или DEFAULT, теги этих "ComponentType" и любого непосредственно следующего типа компонента в серии должны быть различными (см. раздел 30). Если было выбрано автоматическое тегирование, то требование, чтобы теги были различными, применяется только после осуществления автоматического тегирования, и всегда должно быть удовлетворено, если применялось автоматическое тегирование.
24.5.2. Правило 24.5.1 должно применяться к сериям "ComponentType" в корне.
24.5.3. Правило 24.5.1 должно применяться к завершенным сериям "ComponentType" в корне или в расширяющих дополнениях в текстуальном порядке их появления в определении типа (игнорируя все скобки версий и многоточия).
24.6. Когда используется третья или четвертая альтернатива "ComponentTypeLists", все "ComponentType" в расширяющих дополнениях должны иметь теги, отличные от тегов текстуально последующих "ComponentType" до первого "ComponentType", который не отмечен как OPTIONAL или DEFAULT в завершающем "RootComponentTypeList" включительно (если такой есть).
24.7. Преобразование автоматического тегирования появления списка "ComponentTypeLists" логически осуществляется после преобразования, определенного в 24.4, но только если 24.2 определяет, что оно должно применяться к этому экземпляру "ComponentTypeLists". Преобразование автоматического тегирования изменяет каждый тип компонента "ComponentType" в "ComponentTypeLists", заменяя исходный тип "Type" в продукции "NamedType" замещением "TaggedType", определенным в 24.9.
24.8. Если действует автоматическое тегирование и "ComponentType" в корне расширения не имеют тегов, то "ComponentType" в "ExtensionAdditionList" должен быть тегированным типом.
а) в замещающей нотации "TaggedType" используется альтернатива "Tag Type";
б) "Class" замещения "TaggedType" пуст (т.е. тегирование контекстно зависимое);
в) "ClassNumber" в замещении "TaggedType" есть нулевое значение тега для первого "ComponentType" в "RootComponentTypeList" или для первого "NamedType" в "AlternativeTypeLists", единица - для второго и т.д. по мере возрастания номеров тегов;
г) "ClassNumber" в замещении "TaggedType" первого "ComponentType" в "ExtensionAdditionList" есть нуль, если "RootComponentTypeList" пропущен, в противном случае он на единицу больше самого большого "ClassNumber" в "RootComponentTypeList"; следующий "ComponentType" в "ExtensionAdditionList" имеет "ClassNumber" на единицу больше первого и т.д. по мере возрастания номеров тегов;
д) "Type" в замещении "TaggedType" есть исходный тип "Type", который будет замещен.
Примечания
1. Правила, управляющие спецификацией явного или неявного тегирования для замещения "TaggedType", приведены в 30.6. Автоматическое тегирование всегда неявное, если только "Type" не является выборочным типом, нотацией открытого типа или пустой ссылкой "DummyReference" (см. ИСО/МЭК 8824-4, 8.3), когда тегирование является явным.
2. Если удовлетворены требования 24.7, то теги компонентов полностью определены и не изменяются, даже когда тип "последовательность" указывается в определении компонента в другом списке "ComponentTypeList", для которого применяется автоматическое тегирование. Таким образом, в следующем случае:
T :: = SEQUENCE { a Ta, b Tb, c Tc }
E :: = SEQUENCE { f1 E1, f2 T, f3 E3 }
теги, присоединенные к a, b, c не изменятся возможным автоматическим тегированием, примененным к компонентам E.
3. Когда тип "последовательность" встречается как "Type" в "COMPONENTS OF Type", каждое появление в нем "ComponentType" дублируется благодаря применению 24.4 до возможного применения автоматического тегирования к ссылающемуся типу "последовательность". Таким образом, в следующем случае:
T :: = SEQUENCE { a Ta, b SEQUENCE { b1 T1, b2 T2, b3 T3 }, c Tc }
W :: = SEQUENCE { x Wx, COMPONENTS OF T, y Wy }
теги элементов a, b, c в последовательности T не обязательно должны быть теми же самыми, что и теги элементов a, b, c в последовательности W, если W была определена в окружении автоматического тегирования, но теги элементов b1, b2 и b3 - одни и те же в последовательностях T и W. Другими словами, преобразование автоматического тегирования применяется только один раз к данному списку "ComponentTypeLists".
4. Введение подтипа не влияет на автоматическое тегирование.
5. Когда имеет место автоматическое тегирование, вставка новых компонентов может привести к изменениям других компонентов, вызванным побочным эффектом модификации тегов.
24.10. Если используется ключевое слово "OPTIONAL" или "DEFAULT", то соответствующее значение может быть опущено из значения нового типа.
24.11. Если встречает ключевое слово "DEFAULT", то отсутствие значения этого типа должно быть в точности эквивалентно вставке значения, определенного "Value", которое, в свою очередь, должно быть нотацией для значения типа, определенного "Type" в последовательности продукций "NamedType".
24.12. Значение, соответствующее "ExtensionAdditionGroup" (всем компонентам вместе), является факультативным. Однако если такое значение присутствует, то должно присутствовать и значение, соответствующее компонентам в заключенном в скобки "ComponentTypeList", которые не отмечены как OPTIONAL или DEFAULT.
24.13. Идентификаторы "identifier" во всех последовательностях продукций "NamedType" списка "ComponentTypeLists" (вместе с теми, которые получены раскрытием COMPONENTS OF) должны быть различными.
24.14. Значение для данного типа, расширяющего дополнения, не должно устанавливаться, если не установлены значения для всех типов расширяющего дополнения, не отмеченных как OPTIONAL или DEFAULT, которые логически находятся между этим типом расширяющего дополнения и корнем расширения.
Примечания:
1. Когда тип наращивается от корня расширения (версия 1) через версию 2 к версии 3 путем добавления новых расширяющих дополнений, присутствие в кодировании любых дополнений из версии 3 требует присутствия в кодировании всех дополнений версии 2, не отмеченных как OPTIONAL или DEFAULT.
2. "ComponentType", которые имеются в расширяющих дополнениях, но не содержатся в "ExtensionAdditionGroup", должны кодироваться всегда, если они не отмечены как OPTIONAL или DEFAULT, за исключением значения данных уровня представления, переданных отправителем, который использует предшествующую версию абстрактного синтаксиса, где не определена продукция "ComponentType".
3. Рекомендуется использовать продукцию "ExtensionAdditionGroup", так как:
а) она может привести к более компактному кодированию в зависимости от правил кодирования (например, PER);
б) синтаксис более точен в том отношении, если он ясно указывает, что значение типа, определенного в "ExtensionAdditionList" и не отмеченного как OPTIONAL или DEFAULT, всегда должно присутствовать в кодировании, если кодируется группа расширяющих дополнений, в которой определен тип (см. примечание 1);
в) синтаксис ясно указывает, какие типы в "ExtensionAdditionList" должны поддерживаться приложением как группа.
Примечание. Типы "последовательность" (см. 25.2).
SequenceValue :: =
"{" ComponentValueList "}" |
"{" "}"
ComponentValueList :: =
NamedValue |
ComponentValueList "," NamedValue
24.17. Нотация "{" "}" должна использоваться, только если:
а) все последовательности "ComponentType" в "SequenceType" помечены как "DEFAULT", или "OPTIONAL", а все значения - опущены, или
б) нотацией типа была "SEQUENCE {}".
24.18. Должно быть по одному значению "NamedValue" для каждого типа "NamedType" в "SequenceType", который не отмечен как "DEFAULT" или "OPTIONAL", и эти значения должны быть в том же самом порядке, что и соответствующие последовательности "NamedType".
25.1. Нотацией для определения типа "последовательность-из" (см. 3.8.57) из другого типа должна быть "SequenceOfType":
SequenceOfType :: = SEQUENCE OF Type
Примечание. Типы "последовательность" имеют тот же самый тег, что и типы "последовательность-из" (см. 24.15).
SequenceOfValue :: = "{" ValueList "}" | "{" "}"
ValueList :: =
Value |
ValueList "," Value
Нотация "{" "}" используется, когда SequenceOfValue есть пустой список.
25.4. Каждое значение "Value" в списке значений "ValueList" должно быть нотацией для значения типа, заданного в "SequenceOfType".
Примечание. Семантическое значение может быть связано с порядком этих значений.
26.1. Нотацией для определения типа "множество" (см. 3.8.58) из других типов должна быть "SetType":
SetType :: = SET "{" "}" |
SET "{" ExtensionAndException OptionalExtensionMarker "}" |
SET "{" ComponentTypeLists "}"
Продукции "ComponentTypeLists", "ExtensionAndException" и "OptionalExtensionMarker" определены в 24.1.
26.2. "Type" в нотации "COMPONENTS OF Type" должен быть типом "множество". Нотация "COMPONENTS OF Type" должна использоваться для определения включения, в данном месте в списке компонентов, всех типов компонентов, появляющихся в указанном типе, за исключением любых маркеров расширения и расширяющих дополнений, которые могут присутствовать в "Type". (В "COMPONENTS OF Type" включается только "RootComponentTypeList" типа "Type"; маркеры расширения и расширяющие дополнения, если они есть, игнорируются нотацией "COMPONENTS OF Type".) При этом преобразовании игнорируются все ограничения, применяемые к указываемому типу.
Примечание. Это преобразование логически завершается до удовлетворения требований последующих разделов.
26.3. Типы "ComponentType" в типе "множество" должны иметь различающиеся теги (см. раздел 30). Тег каждого нового "ComponentType", добавляемого к "AdditionalComponentTypeList", должен быть канонически больше (см. 8.4), чем тег других компонентов в "AdditionalComponentTypeList".
Примечание. Когда "TagDefault" для модуля, в котором появилась данная нотация, есть "AUTOMATIC TAGS", это условие выполняется независимо от фактических типов "ComponentType", в результате применения 24.7.
Примечание. Типы "множество-из" имеют тот же самый тег, что и типы "множество" (см. 27.2).
26.6. Никакая семантика не должна связываться с порядком значений в типе "множество".
26.7. Значение типа "множество" должно определяться нотацией "SetValue":
SetValue :: = "{" ComponentValueList "}" | "{" "}"
Продукция "ComponentValueList" определена в 24.16.
26.8. Нотация "{" "}" должна использоваться для "SetValue", только если:
а) все последовательности "ComponentType" в "SetType" помечены как "DEFAULT" или "OPTIONAL", а все значения - опущены, или
б) нотацией типа была "SET {}".
26.9. Должно быть по одному значению "NamedValue" для каждого типа "NamedType" в "SetType", который не отмечен как "DEFAULT" или "OPTIONAL".
Примечание. Эти значения "NamedValue" могут появляться в произвольном порядке.
27.1. Нотацией для определения типа "множество-из" (см. 3.8.59) из другого типа должна быть "SetOfType":
SetOfType :: =
SET OF Type
Примечание. Типы "множество" имеют тот же самый тег, что и типы "множество-из" (см. 26.5).
27.3. Значение типа "множество-из" должно определяться нотацией "SetOfValue":
SetOfValue :: = "{" ValueList "}" | "{" "}"
Список значений "ValueList" определен в 25.3.
Нотация "{" "}" используется, когда SetOfValue есть пустой список.
27.4. Каждое значение "Value" в списке значений "ValueList" должно быть нотацией для значения типа "Type", заданного в "SetOfType".
Примечания
1. Никакое семантическое значение не должно быть связано с порядком этих значений.
2. Не требуется, чтобы правила кодирования сохраняли порядок этих значений.
3. Тип "множество-из" не является математическим множеством значений, например для "SET OF INTEGER" значения "{1}" и "{11}" являются различными.
28.1. Нотация для определения выборочного типа (см. 3.8.13) из других типов должна быть "ChoiceType":
ChoiceType :: = CHOICE "{" AlternativeTypeLists "}"
AlternativeTypeLists :: =
RootAlternativeTypeList |
RootAlternativeTypeList "," ExtensionAndException
ExtensionAdditionAlternatives OptionalExtensionMarker
RootAlternativeTypeList :: = AlternativeTypeList
ExtensionAdditionAlternatives :: =
"," ExtensionAdditionAlternativesList | empty
ExtensionAdditionAlternativesList :: = ExtensionAdditionAlternative |
ExtensionAdditionAlternativesList ","
ExtensionAdditionAlternative
ExtensionAdditionAlternative :: = ExtensionAdditionAlternatives |
NamedType
ExtensionAdditionAlternatives :: = "[[" AlternativeTypeList "]]"
AlternativeTypeList :: =
NamedType |
AlternativeTypeList "," NamedType
Примечание. Типы CHOICE :: = { a A } и A являются различными и могут кодироваться различным образом.
28.2. Типы, определенные в продукциях "AlternativeTypeList" в "AlternativeTypeLists", должны иметь различающиеся теги (см. раздел 28). Если действует автоматическое тегирование и "NamedType" в корне расширения не имеют тегов, то "NamedType" в "ExtensionAdditionAlternativesList" не должны тегироваться.
Примечание. Когда "TagDefault" для модуля, в котором появилась данная нотация, есть "AUTOMATIC TAGS", теги автоматически становятся различными в результате применения 24.7.
28.3. Когда продукция "AlternativeTypeLists" встречается в определении модуля, для которого выбрано автоматическое тегирование (см. 12.3), и никакой из экземпляров "NamedType" в ней не содержит тип "Type", являющийся экземпляром "TaggedType", то преобразование автоматического тегирования выбрано для всей "AlternativeTypeList"; в противном случае - нет. Преобразование автоматического тегирования "AlternativeTypeLists", когда оно выбрано, применяется к каждому типу "NamedType" продукции "AlternativeTypeLists" путем замены каждого "Type", исходного для продукции "NamedType", экземпляром замещения "TaggedType", определенного в 24.9.
28.4. Тег каждого нового "NamedType", добавляемого к "ExtensionAdditionAlternativesList", должен быть канонически больше (см. 8.4) тегов других альтернатив в "ExtensionAdditionAlternativesList" и в "ExtensionAdditionAlternativesList" последним должен быть "NamedType".
28.5. Выборочный тип содержит значения, не все из которых имеют один и тот же тег. (Тег зависит от альтернативы, которая дает значение выборочному типу).
28.6. Когда данный тип не имеет маркера расширения и используется там, где настоящий стандарт требует использовать типы с различающимися тегами (см. 24.5, 24.6, 26.3 и 28.2), все возможные теги значений выборочного типа должны рассматриваться с точки зрения этого требования. Это требование иллюстрируется в следующих примерах, где принято, что "TagDefault" не есть "AUTOMATIC TAGS".
Примеры
{b B,
c NULL}
B :: = CHOICE
{d [0] NULL,
e [1] NULL}
{b B,
c C}
B :: = CHOICE
{d [0] NULL,
e [1] NULL}
C :: = CHOICE
{f [2] NULL,
g [3] NULL}
A :: = CHOICE
{b B,
c C}
B :: = CHOICE
{d [0] NULL,
e [1] NULL}
C :: = CHOICE
{f [0] NULL,
g [1] NULL}
В примерах 1 и 2 нотация используется корректно. В примере 3 нотация некорректна без автоматического тегирования, так как теги типов d, f, а также e, g идентичны.
28.7. Идентификаторы "identifier" всех типов "NamedType" в "AlternativeTypeLists" должны отличаться от идентификаторов других типов "NamedType" в этом же списке.
28.8. Значение выборочного типа должно определяться нотацией "ChoiceValue":
ChoiceValue :: = identifier ":" Value
28.9. "Value" должно быть нотацией для значения того типа в "AlternativeTypeLists", который назван идентификатором "identifier".
29.1. Нотацией, определяющей селективный тип (см. 3.8.55), должна быть "SelectionType":
SelectionType :: = identifier "<" Type
где "Type" обозначает выборочный тип, а "identifier" - один из типов "NamedType", появляющихся в "AlternativeTypeLists" определения этого выборочного типа.
29.1.1. Когда "Type" обозначает ограниченный тип, выбор осуществляется из родового типа, игнорируя ограничение.
29.2. Когда "SelectionType" используется в качестве "NamedType", идентификатор "identifier" типа "NamedType" присутствует так же, как и "identifier" типа "SelectionType".
29.3. Когда "SelectionType" используется в качестве "Type", идентификатор "identifier" сохраняется и обозначает тип выбранной альтернативы.
29.4. Нотацией для значения селективного типа должна быть нотация для значения, указанного типом "SelectionType".
Тегированный тип (см. 3.8.64) - это новый тип, который является изоморфным старому типу, но имеет другой тег. Тегированный тип используется главным образом там, где настоящим стандартом требуется использование типов с различающимися тегами (см. 24.5, 24.6, 26.3 и 28.2). Использование в модуле "TagDefault" с "AUTOMATIC TAGS" позволяет выполнить эти требования без явной спецификации нотации тегированного типа в этом модуле.
Примечание. Когда протокол определяет, что значения нескольких типов данных могут быть переданы в один и тот же момент времени, различие тегов может быть необходимым для того, чтобы обеспечить получателю возможность корректно декодировать значение.
30.1. Нотацией для тегированного типа должна быть "TaggedType":
TaggedType :: =
Tag Type |
Tag IMPLICIT Type |
Tag EXPLICIT Type
Tag :: = "[" Class ClassNumber "]"
ClassNumber :: =
number |
DefinedValue
Class :: =
UNIVERSAL |
APPLICATION |
PRIVATE |
empty
30.2. Ссылка на значение "valuereference" в "DefinedValue" должна быть целочисленного типа, и ей должно быть присвоено неотрицательное значение.
30.3. Новый тип изоморфен старому типу, но имеет тег класса "Class" и номер "ClassNumber", за исключением случая, когда "Class" есть "empty"; в этом случае тег - контекстно зависимого класса с номером "ClassNumber".
30.4. Класс "Class" не может быть универсальным классом "UNIVERSAL", за исключением типов, определенных в настоящем стандарте.
Примечания:
1. Использование тегов универсального класса регулярно согласуется ИСО и МЭК-Т.
2. В подразделе C.2.12 содержится руководство и указания по стилистике использования классов тегов.
30.5. Все применения тегов относятся либо к явному, либо к неявному тегированию. Неявное тегирование указывает (тем правилам кодирования, которые обеспечивают соответствующий выбор), что явная идентификация исходных тегов типа "Type" в "TaggedType" не является необходимой при передаче.
Примечание. Может быть полезным сохранять старый тег, когда он универсального класса и, следовательно, недвусмысленно идентифицирует старый тип без знания определения АСН.1 нового типа. Однако минимальное количество октетов для передачи обычно достигается использованием IMPLICIT. Пример кодирования, использующего IMPLICIT, приведен в ИСО/МЭК 8825-1.
30.6. Конструкция тегирования задает явное тегирование, если выполняется одно из следующих утверждений:
а) используется альтернатива "Tag EXPLICIT Type";
б) используется альтернатива "Tag Type", и значение "TagDefault" для модуля есть либо "EXPLICIT TAGS", либо пусто;
в) используется альтернатива "Tag Type", и значение "TagDefault" для модуля есть либо "IMPLICIT TAGS", либо "AUTOMATIC TAGS", но тип, определяемый "Type", есть выборочный или открытый тип, или тип "DummyReference" (см. ИСО/МЭК 8824-4, 8.3).
30.7. Если "Class" есть "empty", то нет ограничений на использование "Tag", кроме тех, которые подразумеваются требованием различия тегов в 24.5, 24.6, 26.3 и 28.2.
30.8. Альтернатива "IMPLICIT" не должна использоваться, если тип, определяемый "Type", есть выборочный или открытый тип, или тип "DummyReference" (см. ИСО/МЭК 8824-4, 8.3).
30.9. Нотацией для значения "TaggedType" должна быть "TaggedValue":
TaggedValue :: = Value
где "Value" есть нотация для значения "Type" в "TaggedType".
Примечание. "Tag" не появляется в этой нотации.
31.1. Тип "идентификатор объекта" (см. 3.8.47) должен указываться нотацией "ObjectIdentifierType":
ObjectIdentifierType :: =
OBJECT IDENTIFIER
31.2. Этот тип имеет тег универсального класса 6.
ObjectIdentifierValue :: =
"{" ObjIdComponentList"}" |
"{" DefinedValue ObjIdComponentList "}"
ObjIdComponentList :: =
ObjIdComponent |
ObjIdComponent ObjIdComponentList
ObjIdComponent :: = NameForm |
NumberForm |
NameAndNumberForm
NameForm :: = identifier
NumberForm :: = number | DefinedValue
NameAndNumberForm :: =
identifier "(" NumberForm ")"
31.4. Ссылка на значение "valuereference" в "DefinedValue" числовой формы "NumberForm" должна быть целочисленного типа и ей должно быть присвоено неотрицательное значение.
31.5. Ссылка на значение "valuereference" в "DefinedValue" как на значение идентификатора объекта "ObjectIdentifierValue" должна быть типа "идентификатор объекта".
31.6. Именная форма "NameForm" должна использоваться только для тех компонентов идентификатора объекта, численное значение и идентификатор которых определены в приложениях A - C ИСО/МЭК 9834-1, и должна быть одним из идентификаторов, определенных в этих приложениях. Когда ИСО/МЭК 9834-1 определяет синонимы идентификаторов, любой синоним может использоваться с той же самой семантикой. Когда одно и то же имя является идентификатором, определенным в ИСО/МЭК 9834-1, и значением ссылки АСН.1 в модуле, содержащем "NameForm", имя в значении идентификатора объекта должно трактоваться как идентификатор ИСО/МЭК 9834-1.
31.7. Альтернатива "number" в числовой форме "NumberForm" должна быть числовым значением, присвоенным компоненту идентификатора объекта.
31.8. Идентификатор "identifier" в "NameAndNumberForm" должен быть задан, когда числовое значение присвоено компоненту идентификатора объекта.
Примечание. Уполномоченные, распределяющие численные значения компонентам идентификаторов объектов, идентифицированы в ИСО/МЭК 9834-1.
31.9. Семантика значения идентификатора объекта определяется в ИСО/МЭК 9834-1.
31.10. Значащей частью компонента идентификатора объекта является "NameForm" или "NumberForm", к которой он сводится и которая предоставляет числовое значение для компонента идентификатора объекта. За исключением дуг, определенных в приложениях A - C ИСО/МЭК 9834-1, числовое значение компонента идентификатора объекта всегда присутствует в экземпляре нотации значения идентификатора объекта.
31.11. Когда значение идентификатора объекта "ObjectIdentifierValue" содержит альтернативу "DefinedValue", список компонентов идентификатора объекта, на который она ссылается, предшествует компонентам, явно присутствующим в значении.
Примечание. ИСО/МЭК 9834-1 рекомендует, чтобы при присваивании значения идентификатора объекта также присваивалось и значение описателя объекта.
Примеры
С идентификаторами, присвоенными в ИСО/МЭК 9834-1, значения
{iso standard 8571 pci (1)}
и
{1 0 8571 1}
идентифицируют объект "pci", определенный в ИСО 8571.
С дополнительным определением
ftam OBJECT IDENTIFIER :: = {iso standard 8571}
этим значениям эквивалентно следующее:
{ftam pci (1)}
32.1. Тип "встроенное-здп" (см. 3.8.21) должен указываться нотацией "EmbeddedPDVType":
EmbeddedPDVType :: = EMBEDDED PDV
32.2. Этот тип имеет тег универсального класса 11.
Примечание. Когда используется согласование уровня представления, те же самые функциональные возможности, что и EXTERNAL, обеспечиваются EMBEDDED PDV (вместе с дополнительными функциональными возможностями), но биты в строке будут другими. В этом случае рекомендуется, чтобы в последующих изменениях версии прикладного протокола была сделана замена EXTERNAL CHOICE (external EXTERNAL, embedded-pdv EMBEDDED PDV}. Дополнительные замены использования EXTERNAL там, где не используется согласование уровня представления, предлагаются в ГОСТ Р ИСО/МЭК 8824-2, приложение C.
32.3. Тип состоит из значений, представляющих:
а) кодирование единственного значения данных, которое может быть, а может и не быть, значением типа АСН.1, и
б) идентификацию (отдельно или вместе):
1) класса значений, содержащего это значение данных (абстрактного синтаксиса), и
2) кодирования, использованного для отличия этого значения данных от других того же класса (синтаксиса передачи).
Примечания
1. Значение данных может быть значением типа АСН.1 или, например, кодированием неподвижного или движущегося изображения. Идентифицируются либо один или два идентификатора объектов, либо ссылки на контекст представления ВОС для идентификации абстрактного синтаксиса и синтаксиса передачи.
2. Идентификация абстрактного синтаксиса и/или кодирования может также определяться проектировщиком приложения в качестве фиксированного значения, и в этом случае она может не кодироваться в конкретном сеансе взаимосвязи.
32.4. Тип "встроенное-здп" имеет ассоциированный тип. Этот тип используется для обеспечения нотации значений и подтипов типа "встроенное-здп".
32.5. Ассоциированный тип для определения значения и подтипа, принимая окружение автоматического тегирования, имеет вид (с нормативными комментариями):
SEQUENCE {
identification CHOICE {
syntaxes SEQUENCE {
abstract OBJECT IDENTIFIER,
transfer OBJECT IDENTIFIER }
- - Идентификаторы объектов абстрактного синтаксиса
- - и синтаксиса передачи - -,
syntax OBJECT IDENTIFIER
- - Единственный идентификатор объекта для идентификации
- - класса или кодирования - -,
presentation-context-id INTEGER
- - (Применяется только в среде ВОС)
- - Согласованный контекст уровня представления
- - идентифицирует класс значения и его кодирование - -,
context-negotiation SEQUENCE {
presentation-context-id INTEGER,
transfer-syntax OBJECT IDENTIFIER }
- - (Применяется только в среде ВОС)
- - Осуществляется процесс согласования контекста
- - для идентификации класса значения и его кодирования - -,
transfer-syntax OBJECT IDENTIFIER
- - Класс значения (например спецификация того, что это
- - значение типа АСН.1) зафиксирован разработчиком
- - приложения (и, следовательно, известен как отправителю,
- - так и получателю). Этот случай предназначен главным
- - образом для обеспечения выборочного шифрования поля
- - (или другого преобразования кодирования) типа АСН.1 - -,
fixed NULL
- - Значение данных есть значение фиксированного типа АСН.1
- - (и, следовательно, известно как отправителю, так
- - и получателю) - - },
data-value-descriptor ObjectDescriptor OPTIONAL
- - Этим обеспечивается человекочитаемая идентификация класса
- - значения - -,
data-value OCTET STRING}
(WITH COMPONENTS {
...,
data-value-descriptor ABSENT})
Примечание. Тип "встроенное-зпд" не допускает включения значения "data-value-descriptor". Однако определение ассоциированного типа отражает базовую общность, которая существует между типом "встроенное-здп", внешним типом и неограниченным типом символьных строк.
32.6. Для альтернативы "presentation-context-id" целочисленное значение должно быть идентификатором контекста представления в множестве определенных контекстов. Эта альтернатива не должна использоваться ни в запросе P-CONNECT, ни в запросе P-ALTER-CONNECT для контекста представления, который предлагается для добавления или удаления этими примитивами запросов.
Примечание. Даже если предлагается единственный синтаксис передачи для контекста представления в списке определений контекстов представления, альтернатива "presentation-context-id" не может использоваться для контекста представления.
32.7. Альтернатива "context-negotiation" должна использоваться в запросах P-CONNECT или в P-ALTER-CONNECT, а целочисленное значение должно быть идентификатором контекста представления, предложенного для добавления к множеству определенных контекстов. Идентификатор объекта "transfer-syntax" должен идентифицировать предложенный синтаксис передачи для того контекста представления, который используется для кодирования значения.
32.8. Нотация для значения типа "встроенное-здп" должна быть нотацией значения для ассоциированного типа, определенного в 32.5, где значение "data-value" OCTET STRING представляет собой кодирование, использующее специфицированный в "identification" синтаксис передачи.
EmbeddedPdvValue :: = SequenceValue - - значение ассоциированного типа, определенного в 32.5.
32.9. Пример 1 - Когда проектировщик приложения хочет, чтобы кодирование не зависело от любого окружения представления (и, следовательно, могло передаваться, храниться и вызываться без модификаций), необходимо запретить использование альтернатив "presentation-context-id" и "context-negotiation". Это может быть сделано следующим образом:
EMBEDDED PDV (WITH COMPONENTS {
...,
identification (WITH COMPONENTS {
...,
presentation-context-id ABSENT,
context-negotiation ABSENT })})
32.10. Пример 2 - Если обязательно должна использоваться единственная альтернатива, например "syntaxes", то это может быть сделано следующим образом:
EMBEDDED PDV (WITH COMPONENTS {
...,
identification (WITH COMPONENTS {
syntaxes PRESENT })})
33.1. Внешний тип (см. 3.8.37) должен указываться нотацией "ExternalType":
ExternalType :: = EXTERNAL
33.2. Этот тип имеет тег универсального класса 8.
33.3. Тип состоит из значений, представляющих:
а) кодирование единственного значения данных, которое может быть, а может и не быть значением типа АСН.1, и
б) идентификацию:
1) класса значений, содержащего это значение данных (абстрактного синтаксиса), и
2) кодирования, использованного для отличия этого значения данных от других того же класса (синтаксиса передачи), и
в) (факультативно) описатель объекта, который обеспечивает человекочитаемое описание класса значения данных. Факультативный описатель объекта может присутствовать, если только он явно допускается комментарием, связанным с использованием нотации "ExternalType".
Примечание. Примечание 1 к 32.3 применяется также и к внешнему типу.
33.4. Внешний тип имеет ассоциированный тип. Он используется для задания точного определения абстрактных значений внешнего типа и обеспечения нотаций для его значения и подтипа.
Примечание. Правила кодирования могут определять различные типы, которые используются для производного кодирования, или могут специфицировать кодирования без ссылки на какой-либо ассоциированный тип. В частности, кодирование BER использует эквивалент типа "последовательность", идентичный тому, который присутствовал в определении внешнего типа в ГОСТ Р ИСО/МЭК 8824, и кодирование внешних значений с помощью BER не изменяется.
33.5. Ассоциированный тип для определения значения и подтипа, принимая окружение автоматического тегирования, имеет вид (с нормативными комментариями):
SEQUENCE {
identification CHOICE {
syntaxes SEQUENCE {
abstract OBJECT IDENTIFIER,
transfer OBJECT IDENTIFIER }
- - Идентификаторы объектов абстрактного синтаксиса
- - и синтаксиса передачи - -,
syntax OBJECT IDENTIFIER
- - Единственный идентификатор объекта для идентификации
- - класса или кодирования - -,
presentation-context-id INTEGER
- - (Применяется только в среде ВОС)
- - Согласованный контекст уровня представления
- - идентифицирует класс значения и его кодирование - -,
context-negotiation SEQUENCE {
presentation-context-id INTEGER,
transfer-syntax OBJECT IDENTIFIER }
- - (Применяется только в среде ВОС)
- - Осуществляется процесс согласования контекста
- - для идентификации класса значения и его кодирования - -,
transfer-syntax OBJECT IDENTIFIER
- - Класс значения (например спецификация того, что это
- - значение типа АСН.1) зафиксирован разработчиком
- - приложения (и, следовательно, известен как отправителю,
- - так и получателю). Этот случай предназначен главным
- - образом для обеспечения выборочного шифрования поля
- - (или другого преобразования кодирования) типа АСН.1 - -,
fixed NULL
- - Значение данных есть значение фиксированного типа АСН.1
- - (и, следовательно, известно как отправителю, так
- - и получателю) - - },
data-value-descriptor ObjectDescriptor OPTIONAL
- - Этим обеспечивается человекочитаемая идентификация класса
- - значения - -,
data-value OCTET STRING}
(WITH COMPONENTS {
...,
identification (WITH COMPONENTS {
...,
syntaxes ABSENT,
transfer-syntax ABSENT,
fixed ABSENT })})
Примечание. Внешний тип не допускает включения альтернатив "syntaxes", "transfer-syntax" и "fixed" для "identification". Эти альтернативы не могут быть допустимы для внешнего типа потому, что необходимо поддерживать обратную совместимость с ГОСТ Р ИСО/МЭК 8824. Проектировщики приложений, которым требуются эти альтернативы, должны использовать тип "встроенное-здп". Определение ассоциированного типа отражает базовую общность, которая существует между типом "встроенное-зпд", внешним типом и неограниченным типом символьных строк.
33.7. Нотация для значения внешнего типа должна быть нотацией значения для ассоциированного типа, определенного в 33.5, где значение "data-value" OCTET STRING представляет собой кодирование, использующее специфицированный в "identification" синтаксис передачи.
ExternalValue :: = SequenceValue - - значение ассоциированного типа,
определенного в 33.5.
Примечание. По историческим причинам правила кодирования могут передавать в EXTERNAL встроенные значения, кодирования которых не являются кратными 8 битам. Такие значения не могут быть представлены в нотации значения, использующей ассоциированный тип.
Эти типы состоят из строк символов из некоторого заданного символьного репертуара. Обычно определяют символьный репертуар и его кодирование с использованием ячеек одной или нескольких таблиц; каждая ячейка соответствует символу в репертуаре. Обычно каждой ячейке присвоены графический символ и имя символа, хотя в некоторых репертуарах ячейки оставлены пустыми или имеют имена, но не имеют представления (например ячейки с именами, но без представления, включают управляющие символы, как EOF в ИСО 646, и символы интервала, как THIN-SPACE и EN-SPACE в ИСО/МЭК 10646-1).
Термин абстрактный символ обозначает всю информацию, связанную с ячейкой в таблице символьного репертуара. Информация, связанная с ячейкой, обозначает отдельный абстрактный символ в репертуаре, даже если этой информацией является null (ни графический символ, ни имя не присвоены ячейке).
Нотация значений АСН.1 для типов символьных строк имеет три варианта (которые можно комбинировать), формально определенные ниже:
а) печатное представление символов в строке, использующее присвоенные графические символы, возможно, включая символы интервала; это нотация "cstring";
Примечания
1. Такое представление может оказаться двусмысленным, когда один и тот же графический символ используется для нескольких символов в репертуаре.
2. Такое представление может оказаться двусмысленным, когда используются символы интервала или спецификация печатается с использованием пропорционального шрифта.
б) перечень символов в значении символьной строки путем задания серий ссылок на значения АСН.1, которые были присвоены символам; множество таких ссылок на значения определено в модуле ASN1-CHARACTER-MODULE в разделе 37 для репертуаров символов ИСО/МЭК 10646-1 и IA5String; это представление не доступно для других символьных репертуаров, если только пользователь не определит такие ссылки на значения, используя нотацию, описанную в а) или в);
в) перечень символов в значении символьной строки путем идентификации каждого абстрактного символа позицией его ячейки в таблице репертуара символов; эта форма доступна только для IA5String, UniversalString, UTF8String и BMPString.
35.1. Нотацией для указания типа символьной строки (см. 3.8.11) должна быть
CharacterStringType :: = RestrictedCharacterStringType |
UnrestrictedCharacterStringType
"RestrictedCharacterStringType" является нотацией для ограниченного типа символьной строки и определена в разделе 36; "UnrestrictedCharacterStringType" является нотацией для неограниченного типа символьной строки и определена в 39.1.
35.2. Тег каждого ограниченного типа символьной строки определен в 36.1. Тег неограниченного типа символьной строки определен в 39.2.
35.3. Нотацией для значения символьной строки должна быть
CharacterStringValue :: = RestrictedCharacterStringValue |
UnrestrictedCharacterStringValue
Нотация "RestrictedCharacterStringValue" определена в разделе 36.7. Нотация "UnrestrictedCharacter-StringValue" определена в 39.6.
В данном разделе определяются типы, значения которых ограничены последовательностями из нуля, одного или нескольких символов из некоторой заданной совокупности символов. Нотацией для указания ограниченного типа символьной строки должна быть "RestrictedCharacterStringType":
RestrictedCharacterStringType :: = BMPString |
GeneralString |
GraphicString |
IA5String |
ISO646String |
NumericString |
PrintableString |
TeletexString |
T61String |
UniversalString |
UTF8String |
VideotexString |
Visible String
Каждая альтернатива "RestrictedCharacterStringType" определяется заданием:
а) тега, присвоенного типу, и
б) имени (например NumericString), которым тип указывается, и
в) символами в совокупности символов, используемой в определении типа, путем указания таблицы, перечисляющей графические символы, или через ссылку на регистрационный номер в Международном регистре ИСО наборов кодированных символов, или через ссылку на ИСО/МЭК 10646-1.
36.1. В таблице 3 приведены имена, по которым ссылаются на ограниченные типы символьных строк, номера тегов универсального класса, присвоенные типам, определяющие регистрационные номера, таблицы или номера разделов настоящего стандарта и, при необходимости, идентифицированы примечания, относящиеся к строке таблицы. Когда в нотации определены синонимы, они приводятся в скобках.
Примечание. Теги, присвоенные типам символьных строк, недвусмысленно идентифицируют тип. Однако если АСН.1 используется для определения новых типов из приведенных здесь (в частности, используя IMPLICIT), то будет невозможно распознать эти типы без знания определения АСН.1.
Таблица 3
???????????????????????????????????????????????????????????????????????????
? Имя для ссылки ? Номер тега ? Определяющий регистрационный ?Приме- ?
? на тип ?универсального? номер <*>, номер таблицы ?чание ?
? ? класса ? или раздела стандарта ? ?
???????????????????????????????????????????????????????????????????????????
?UTF8String ? 12 ?См. 36.13 ? - ?
? ? ? ? ?
? ? ? ? ?
? ? ? ? ?
?TeletexString ? 20 ?6, 87, 102, 103, 106, 107, 126, ? 2 ?
?(T61String) ? ?144, 150, 153, 156, 164, 165, ? ?
? ? ?168 + SPACE + DELETE ? ?
? ? ? ? ?
?VideotexString ? 21 ?1, 13, 72, 73, 87, 89, 102, 108,? 3 ?
? ? ?126, 128, 129, 144, 150, 153, ? ?
? ? ?164, 165, 168 + SPACE + DELETE ? ?
? ? ? ? ?
?IA5String ? 22 ?1, 6 + SPACE + DELETE ? - ?
? ? ? ? ?
?GraphicString ? 25 ?Все графические наборы + SPACE ? - ?
? ? ? ? ?
?VisibleString ? 26 ?6 + SPACE ? 4 ?
?(ISO646Strin) ? ? ? ?
? ? ? ? ?
?GeneralString ? 27 ?Все графические и символьные ? - ?
? ? ?наборы + SPACE + DELETE ? ?
? ? ? ? ?
?UniversalString ? 28 ?См. 36.6 ? - ?
? ? ? ? ?
?BMPString ? 30 ?См. 36.12 ? - ?
???????????????????????????????????????????????????????????????????????????
?регистре ИСО наборов кодированных символов, которые должны?
?использоваться с Escape-последовательностями. ?
? ?
? Примечания ?
?отображения несущественны. ?
?на рекомендацию МСЭ-Т Т.61, содержащую правила их использования.?
?Регистрационные записи 6 и 156 могут использоваться вместо записей 102 и?
?103. ?
?обеспечивают функциональные возможности Рекомендаций МСЭ-Т Т.100 и?
?Т.101. ?
?наборов кодированных символов, которые должны использоваться с Escape-?
?последовательностями, является неявным указанием ИСО 646. В этом состоит?
?отличие от ГОСТ Р ИСО/МЭК 8824, где приводился регистрационный номер 2?
?(неявное указание на ИСО 646). В приложениях, где желательно применять?
?регистрационный номер 2, следует использовать другие способы указания?
?[например через неограниченные символьные строки (см. раздел 39)] для?
?обращения к старому определению VisibleString или к ГОСТ Р ИСО/МЭК 8824. ?
???????????????????????????????????????????????????????????????????????????
36.2. В таблице 4 приведены символы, которые могут появляться в типе NumericString, и их абстрактный синтаксис.
Таблица 4
???????????????????????????????????????????????????????????????????????????
? Имя ? Графическое представление ?
???????????????????????????????????????????????????????????????????????????
? Цифры ? 0, 1, ... 9 ?
? Пробел ? (пробел) ?
???????????????????????????????????????????????????????????????????????????
36.3. Следующие значения идентификатора и описателя объекта назначены для идентификации и описания абстрактного синтаксиса символов NumericString:
{ joint-iso-itu-t asn1 (1) specification (0) characterStrings (1) numericString (0) }
и
"NumericString character abstract syntax"
Примечания
1. Это значение идентификатора объекта может использоваться в значениях CHARACTER STRING и в других случаях, когда необходимо передать идентификацию типа символьной строки отдельно от значения.
2. Значение абстрактного синтаксиса символов NumericString может быть закодировано:
а) по одному из правил ИСО/МЭК 10646-1 для кодирования абстрактных символов. В этом случае синтаксис передачи символов идентифицируется идентификатором объекта, связанным с этими правилами в ИСО/МЭК 10646-1, приложение M;
б) по правилам кодирования АСН.1 для встроенного типа NumericString. В этом случае синтаксис передачи символов идентифицируется значением идентификатора объекта {joint-iso-itu-t asn1 (1) basic-encoding (1) }.
36.4. В таблице 5 приведены символы, которые могут появляться в типе PrintableString, и их абстрактный синтаксис.
Таблица 5
???????????????????????????????????????????????????????????????????????????
? Имя ? Графическое представление ?
???????????????????????????????????????????????????????????????????????????
?Прописные буквы ? A, B, ... Z ?
?Строчные буквы ? a, b, ... z ?
?Цифры ? 0, 1, ... 9 ?
?Пробел ? (пробел) ?
?Апостроф ? ' ?
?Левая скобка ? ( ?
?Правая скобка ? ) ?
?Знак плюс ? + ?
?Запятая ? , ?
?Дефис ? - ?
?Точка ? . ?
?Наклонная черта ? / ?
?Двоеточие ? : ?
?Знак равенства ? = ?
?Знак вопроса ? ? ?
???????????????????????????????????????????????????????????????????????????
36.5. Следующие значения идентификатора и описателя объекта назначены для идентификации и описания абстрактного синтаксиса символов PrintableString:
{ joint-iso-itu-t asn1 (1) specification (0) characterStrings (1) printableString (1) }
и
"PrintableString character abstract syntax"
Примечания
1. Это значение идентификатора объекта может использоваться в значениях CHARACTER STRING и в других случаях, когда необходимо передать идентификацию типа символьной строки отдельно от значения.
2. Значение абстрактного синтаксиса символов PrintableString может быть закодировано:
а) по одному из правил ИСО/МЭК 10646-1 для кодирования абстрактных символов. В этом случае синтаксис передачи символов идентифицируется идентификатором объекта, связанным с этими правилами в ИСО/МЭК 10646-1, приложение M;
б) по правилам кодирования АСН.1 для встроенного типа PrintableString. В этом случае синтаксис передачи символов идентифицируется значением идентификатора объекта {joint-iso-itu-t asn1 (1) basic-encoding (1)}.
36.6. Символами, которые могут появляться в типе UniversalString, являются любые символы, допускаемые ИСО/МЭК 10646-1, а использование этого типа влечет за собой требования соответствия, специфицированные в ИСО/МЭК 10646-1, особенно относительно ограничений на использование зон ИСО/МЭК 10646-1.
Примечания
1. Использование этого типа без ограничений не рекомендуется, так как соответствие будет, в общем случае, не практичным.
2. В разделе 37 определен модуль АСН.1, содержащий ряд подтипов этого типа для совокупности графических символов для подмножеств, определенной в приложении A к ИСО/МЭК 10646-1.
36.7. Нотацией значений для ограниченных типов символьных строк должна быть "cstring" (см. 11.11), "CharacterStringList", "Quadruple" или "Tuple". Нотация "Quadruple" допускается только для символьных строк длиной в один символ и может использоваться только в нотации значения для типов UniversalString, UTF8String или BMPString. Нотация "Tuple" допускается только для символьных строк длиной в один символ и может использоваться только в нотации значения для типа IA5String.
RestrictedCharacterStringValue :: = cstring | CharacterStringList | Quadruple | Tuple
CharacterStringList :: = "{" CharSyms "}"
CharSyms :: = CharsDefn | CharSyms "," CharsDefn
CharsDefn :: = cstring | DefinedValue
Quadruple :: = "{" Group "," Plane "," Row "," Cell "}"
Group :: = number
Plane :: = number
Row :: = number
Cell :: = number
Tuple :: = "{" TableColumn "," TableRow "}"
TableColumn :: = number
TableRow :: = number
Примечания
1. Нотация "cstring" может использоваться только для среды, допускающей отображение графических символов, представленных в значении. Обратно, если среда не имеет таких возможностей, то единственным способом спецификации значения символьной строки, использующей такие графические символы, является нотация "CharacterStringList", только если тип есть UniversalString, UTF8String, BMPString или IA5String; при этом для "CharsDefn" используется альтернатива "DefinedValue" (см. 37.1.2).
2. В разделе 37 определяется ряд ссылок "valuereference", которые обозначают единичные символы (строки длиной 1) типов BMPString (и, следовательно, UniversalString и UTF8String) и IA5String.
Пример - Допустим, что мы хотим специфицировать значение
для UniversalString, когда символ {joint-iso-itu-t asn1 (1) specification (0) modules (0) iso10646 (0)}; MyAlphabet :: = UniversalString (FROM (BasicLatin | greekCapitalLetterSigma)) mystring MyAlphabet :: = {"abc", greekCapitalLetterSigma, "def"}
3. При спецификации значения типа UniversalString, UTF8String или BMPString, нотация "cstring" не должна использоваться, если двусмысленность, возникающая из-за различия графических символов с одинаковым представлением, не может быть разрешена.
Пример - Следующая нотация "cstring" не должна использоваться, так как графические символы 'H', 'O', 'P' и 'E' встречаются в алфавитах BASIC LATIN, CYRILLIC и BASIC GREEK и, следовательно, двусмысленны.
IMPORTS BasicLatin, Cyrillic, BasicGreek FROM ASN1-CHARACTER-MODULE
{joint-iso-itu-t asn1 (1) specification (0) modules (0) iso10646 (0)}; MyAlphabet :: = UniversalString (FROM (BasicLatin | Cyrillic | BasicGreek)) mystring MyAlphabet :: = "HOPE"
Альтернативным недвусмысленным определением "mystring" могло бы быть следующее:
mystring MyAlphabet (BasicLatin) :: = "HOPE"
Формально "mystring" является ссылкой на значение подмножества "MyAlphabet", но она, по правилам отображения значений, приведенным в Приложении F, может быть использована, когда необходима ссылка на значение в пределах "MyAlphabet".
36.8. Альтернатива "DefinedValue" в "CharsDefn" должна ссылаться на значение этого типа.
36.9. Число "number" в продукциях "Plane", "Row" и "Cell" должно быть меньше 256, а в продукции "Group" - меньше 128.
36.10. Продукция "Group" специфицирует группу в кодовом пространстве UCS, "Plane" - плоскость в группе, "Row" - строку в плоскости, а "Cell" - ячейку в строке. Абстрактный символ, идентифицированный этой нотацией, является абстрактным символом, специфицированным значениями "Group", "Plane", "Row" и "Cell". В любом случае множество допустимых значений может быть ограничено введением подтипа.
Примечание. Проектировщики приложений должны тщательно рассматривать соответствие, когда используют такие типы символьных строк с открытым завершением, как GeneralString, GraphicString и UniversalString без ограничений. Тщательное рассмотрение соответствия необходимо и для ограниченных, но длинных типов строк, таких как TeletexString.
36.11. Число "number" в продукции "TableColumn" должно быть от нуля до семи, а в продукции "TableRow" - от нуля до пятнадцати. "TableColumn" задает столбец, а "TableRow" - строку в кодовой таблице в соответствии с рисунком 1 ИСО/МЭК 2022. Эта нотация используется только для IA5String, когда кодовая таблица содержит регистрационную запись 1 в столбцах 0, 1 и регистрационную запись 6 в столбцах 2 - 7 (см. Международный регистр ИСО наборов кодированных символов, которые должны использоваться с Escape-последовательностями).
36.12. BMPString является подтипом UniversalString, который имеет свой собственный уникальный тег и моделирует основную многоязычную плоскость (первые 64K - 2 ячеек) ИСО/МЭК 10646-1. Он имеет ассоциированный тип, определенный как:
UniversalString (Bmp)
где Bmp определяется в модуле АСН.1 ASN1-CHARACTER-MODULE (см. раздел 37) как подтип UniversalString, соответствующий совокупности имен "BMP", определенной в ИСО/МЭК 10646-1, приложение A.
Примечания
1. Так как BMPString является встроенным типом, то он не определяется в ASN1-CHARACTER-MODULE.
2. Целью определения BMPString как встроенного типа является предоставление возможности по правилам кодирования (таким как BER), которые не учитывают ограничения, использовать 16-битовое, а не 32-битовое кодирование.
3. В нотациях значений BMPString допустимы значения UniversalString и UTF8String.
36.13. На абстрактном уровне UTF8String является синонимом UniversalString и может применяться всякий раз, когда используется UniversalString (подчиняясь правилам, требующим различия тегов), но имеет другой тег и тип.
Примечание. Его кодирование отличается от кодирования UniversalString и в большинстве случаев будет менее длинным.
определенных в ИСО/МЭК 10646-1
В настоящем разделе специфицирован встроенный модуль АСН.1, который содержит определения ссылочных имен значений для всех символов ИСО/МЭК 10646-1, и каждое имя указывает значение UniversalString длиной 1. Этот модуль также содержит определения ссылочных имен типов для всех совокупностей символов ИСО/МЭК 10646-1, и каждое имя указывает подмножество UniversalString.
Примечание. Эти значения доступны для использования в нотациях значений типа UniversalString и типов, полученных из него. Все ссылки на типы и значения, определенные в модуле, специфицированном в 37.1, являются экспортируемыми и должны быть импортированы любым использующим их модулем.
Данный модуль не приводится здесь полностью. Вместо этого специфицирован способ, которым он определяется.
ASN1-CHARACTER-MODULE {joint-iso-itu-t asn1 (1) specification (0) modules (0) iso10646 (0)}
DEFINITIONS :: = BEGIN
- - Все ссылки на значения и типы, определенные в данном модуле, являются
- - экспортируемыми и могут быть импортированы любым модулем.
- - Управляющие символы ИСО 646:
nul IA5String :: = {0, 0}
soh IA5String :: = {0, 1}
stx IA5String :: = {0, 2}
etx IA5String :: = {0, 3}
eot IA5String :: = {0, 4}
enq IA5String :: = {0, 5}
ack IA5String :: = {0, 6}
bel IA5String :: = {0, 7}
bs IA5String :: = {0, 8}
ht IA5String :: = {0, 9}
lf IA5String :: = {0, 10}
vt IA5String :: = {0, 11}
ff IA5String :: = {0, 12}
cr IA5String :: = {0, 13}
so IA5String :: = {0, 14}
si IA5String :: = {0, 15}
dle IA5String :: = {1, 0}
dc1 IA5String :: = {1, 1}
dc2 IA5String :: = {1, 2}
dc3 IA5String :: = {1, 3}
dc4 IA5String :: = {1, 4}
nak IA5String :: = {1, 5}
syn IA5String :: = {1, 6}
etb IA5String :: = {1, 7}
can IA5String :: = {1, 8}
em IA5String :: = {1, 9}
sub IA5String :: = {1, 10}
esc IA5String :: = {1, 11}
is4 IA5String :: = {1, 12}
is3 IA5String :: = {1, 13}
is2 IA5String :: = {1, 14}
is1 IA5String :: = {1, 15}
de1 IA5String :: = {7, 15}
37.1.2. Для каждой записи в каждом списке имен для графических символов (глифов), показанных в разделах 24 и 25 ИСО/МЭК 10646-1, модуль содержит утверждение вида:
<namedcharacter>BMPString :: = <tablecell>
- - представляет символ <iso10646name>, см. ИСО/МЭК 10646-1,
где: а) <iso10646name> - имя символа, полученное из перечисленных в ИСО/МЭК 10646-1;
б) <namedcharacter> - строка, полученная применением к <iso10646name> процедур, установленных в 37.2;
в) <tablecell> - глиф в ячейке таблицы в ИСО/МЭК 10646-1, соответствующей записи списка.
Пример
latinCapitalLetterA BMPString :: = {0, 0, 0, 65}
- - представляет символ LATIN CAPITAL LETTER A, см. ИСО/МЭК 10646-1
greekCapitalLetterSigma BMPString:: = {0, 0, 3, 145}
- - представляет символ GREEK CAPITAL LETTER SIGMA, см. ИСО/МЭК 10646-1.
37.1.3. Для каждого имени совокупности графических символов, определенной в ИСО/МЭК 10646-1, приложение A, в модуль включается утверждение вида:
<namedcollectionstring> :: = BMPString
(FROM (<alternativelist>))
- - представляет совокупность символов <collectionstring>,
- - см. ИСО/МЭК 10646-1,
где а) <collectionstring> - имя совокупности, присвоенное в ИСО/МЭК 10646-1;
б) <namedcollectionstring> - образовано применением к <collectionstring> процедуры 37.3;
в) <alternativelist> - образуется с использованием <namedcharacter>, как описано в 37.2, для каждого символа, определенного в ИСО/МЭК 10646-1.
Результирующая ссылка на тип, <namedcollectionstring>, образует ограниченное подмножество (см. руководство в Приложении D).
Примечание. Ограниченное подмножество является списком символов в заданном подмножестве. Противоположность ему - выбранное подмножество, которое является совокупностью символов, перечисленных в ИСО/МЭК 10646-1, приложение A, плюс совокупность BASIC LATIN.
Пример (частичный):
space BMPString :: = {0, 0, 0, 32}
exclamationMark BMPString :: = {0, 0, 0, 33}
quotationMark BMPString :: = {0, 0, 0, 34}
... - - и так далее
tilde BMPString :: = {0, 0, 0, 126}
BasicLatin :: = BMPString
(FROM (space
| exclamationMark
| quotationMark
|... - - и так далее
| tilde)
)
- - представляет совокупность символов BASIC LATIN,
- - см. ИСО/МЭК 10646-1. Многоточия в этом примере используются
- - для краткости и означают и так далее";
- - их нельзя использовать в реальном модуле АСН.1.
37.1.4. В ИСО/МЭК 10646-1 определены три уровня реализации. По умолчанию все типы, определенные в модуле ASN1-CHARACTER-MODULE, за исключением "Level1" и "Level2", соответствуют реализации уровня 3, так как эти типы не имеют ограничений на использование комбинированных символов. "Level1" указывает, что требуется реализация уровня 1, "Level2" - уровня 2, а "Level3" - уровня 3. Таким образом, в ASN1-CHARACTER-MODULE определено следующее:
Level1 :: = BMPString (FROM (ALL EXCEPT CombiningCharacters))
Level2 :: = BMPString (FROM (ALL EXCEPT CombiningCharactersB-2))
Level3 :: = BMPString
Примечания
1. "CombiningCharacters" и "CombiningCharactersB-2" являются ссылками <namedcollectionstring>, удовлетворяющими совокупностям "COMBINING CHARACTERS" и "COMBINING CHARACTERS B-2", соответственно, определенным в ИСО/МЭК 10646-1, приложение A.
2. "Level1" и "Level2" используются либо следом за "IntersectionMark" (см. раздел 46), либо как единственное ограничение в "ConstraintSpec". Примеры см. в C.2.7.1.
3. Дополнительную информацию см. в D.2.5.
37.1.5. Модуль завершается утверждением:
END
37.1.6. Определяемым пользователем эквивалентом примера 37.1.3 является:
BasicLatin :: = BMPString (FROM (space .. tilde))
- - представляет совокупность символов BASIC LATIN, см. ИСО/МЭК 10646-1.
37.2. <namedcharacter> является строкой, полученной из <iso10646name> (см. 37.1.2) применением следующего алгоритма:
а) каждая прописная буква <iso10646name> преобразуется в соответствующую строчную букву, если только прописной букве не предшествует символ SPACE; в этом случае прописная буква остается неизменной;
б) каждая цифра и символ HYPHEN-MINUS остаются неизменными;
в) каждый символ SPACE удаляется.
Примечание. Приведенный алгоритм, вместе с руководством по наименованию символов в приложении K ИСО/МЭК 10646-1, всегда приведет к недвусмысленной нотации значения для любого имени символа, приведенного в ИСО/МЭК 10646-1.
Пример - Символ ИСО/МЭК 10646-1 в строке 0, ячейке 60, который назван "LESS-THAN SIGN" и имеет графическое представление "<", может быть указан с использованием "DefinedValue"
less-thanSign
37.3. <namedcollectionstring> является строкой, полученной из <collectionstring> применением следующего алгоритма:
а) каждая прописная буква в имени совокупности ИСО/МЭК 10646-1 преобразуется в соответствующую строчную букву, если только прописной букве не предшествует символ SPACE или она не является первой буквой в имени; в этом случае прописная буква остается неизменной;
б) каждая цифра и символ HYPHEN-MINUS остаются неизменными;
в) каждый символ SPACE удаляется.
Примеры
1. Совокупность, идентифицированная в приложении A ИСО/МЭК 10646-1 как
BASIC LATIN
имеет ссылку на тип АСН.1
BasicLatin
2. Тип символьной строки, состоящий из символов совокупностей BASIC LATIN и BASIC ARABIC, может быть определен следующим образом:
My-Character-String :: = BMPString (FROM (BasicLatin | BasicArabic))
Примечание. Приведенная конструкция необходима потому, что более простая.
My-Character-String :: = BMPString (BasicLatin | BasicArabic) допускает лишь строки, состоящие целиком из символов либо BASIC LATIN, либо BASIC ARABIC, но не из их смеси.
38.1. Для создания подтипов с помощью "ValueRange" и возможности использования правил кодирования определен канонический порядок символов для UniversalString, BMPString, NumericString, PrintableString, VisibleString и IA5String.
38.2. Для целей только данного раздела каждый символ имеет однозначное соответствие ячейке кодовой таблицы, независимо от того, присвоено ли ячейке имя символа и представление, является ли символ управляющим или печатным, комбинированным или некомбинированным.
38.3. Канонический порядок абстрактных символов определяется каноническим порядком их ячеек.
38.4. Для UniversalString канонический порядок ячеек определяется (см. ИСО/МЭК 10646-1) как:
256*(256*(128*(номер группы) + (номер плоскости)) + (номер строки)) + (номер ячейки)
Полный набор содержит ровно 128*256*256*256 символов. Конечные точки диапазонов "ValueRange" в нотациях "PermittedAlphabet" (или отдельных символов) могут быть заданы, используя либо ссылку на значение АСН.1, определенную в модуле ASN1-CHARACTER-MODULE, либо (когда графический символ является недвусмысленным в контексте спецификации) графическим символом в "cstring" (модуль ASN1-CHARACTER-MODULE определен в 37.1). Невозможно задать ячейку в качестве конечной точки диапазона или идентифицировать отдельный символ, когда этой ячейке не присвоено имя символа или представление.
38.5. Для BMPString канонический порядок ячеек определяется (см. ИСО/МЭК 10646-1) как
256*(номер строки) + (номер ячейки)
Полный набор содержит ровно 256*256 символов. Конечные точки диапазонов "ValueRange" в нотациях "PermittedAlphabet" (или отдельных символов) могут быть заданы, используя либо ссылку на значение АСН.1, определенную в модуле ASN1-CHARACTER-MODULE, либо (когда графический символ является недвусмысленным в контексте спецификации) графическим символом в "cstring". Невозможно задать ячейку в качестве конечной точки диапазона или идентифицировать отдельный символ, когда этой ячейке не присвоено имя символа или представление.
38.6. Для NumericString канонический порядок с возрастанием слева направо определяется (см. таблицу 4 в 36.2) как
(пробел) 0 1 2 3 4 5 6 7 8 9
Полный набор содержит ровно 11 символов. Конечная точка диапазона "ValueRange" (или отдельные символы) может быть задана использованием графического символа в "cstring".
Примечание. Этот порядок является тем же самым, что и порядок соответствующих символов в совокупности BASIC LATIN ИСО/МЭК 10646-1.
38.7. Для PrintableString канонический порядок с возрастанием слева направо определяется (см. таблицу 5 в 36.4) как
(пробел) (апостроф) (левая скобка) (правая скобка) (знак плюс)
(запятая) (дефис) (точка) (наклонная черта) 0123456789
(двоеточие) (знак равенства) (знак вопроса)
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
Полный набор содержит ровно 74 символа. Конечная точка диапазона "ValueRange" (или отдельные символы) может быть задана использованием графического символа в "cstring".
Примечание. Этот порядок является тем же самым, что и порядок соответствующих символов в совокупности BASIC LATIN ИСО/МЭК 10646-1.
38.8. Для VisibleString канонический порядок ячеек определяется кодированием ИСО 646 (названным ISO 646 ENCODING) следующим образом:
(ISO 646 ENCODING) - 32
Примечание. Таким образом, канонический порядок тот же самый, что и для символов в ячейках 2/0 - 7/14 кодовой таблицы ИСО 646.
Полный набор содержит ровно 95 символов. Конечная точка диапазона "ValueRange" (или отдельные символы) могут быть заданы использованием графического символа в "cstring".
38.9. Для IA5String канонический порядок ячеек определяется кодированием ИСО/МЭК 646 следующим образом:
(ISO 646 ENCODING)
Полный набор содержит ровно 128 символов. Конечная точка диапазона "ValueRange" (или отдельные символы) может быть задана использованием графического символа в "cstring" или ссылкой на значение управляющего символа ИСО 646, определенной в 37.1.1.
В данном значении определяется тип, значениями которого являются значения любого символьного абстрактного синтаксиса. Абстрактный синтаксис может быть частью множества определенных контекстов в экземпляре соединения или может быть непосредственно указан для каждого экземпляра использования неограниченного типа символьной строки.
Примечания
1. Символьный абстрактный синтаксис (и один или несколько соответствующих символьных синтаксисов передачи) может быть определен любой организацией, имеющей право присваивать идентификаторы объектов АСН.1.
2. Профили, создаваемые сообществами по интересам, будут определять символьные абстрактные синтаксисы и синтаксисы передачи, которые должны поддерживаться для конкретных экземпляров или групп символьных строк. Будет принято включать ссылку на поддерживаемые синтаксисы в форму заявки о соответствии реализации протоколу. Группирование экземпляров для целей спецификации прикладного уровня может быть достигнуто использованием различных ссылок на типы АСН.1 (все из которых должны быть ссылками на тип CHARACTER STRING).
39.1. Неограниченный тип символьных строк (см. 3.8.69) должен указываться нотацией "UnrestrictedCharacterStringType"
UnrestrictedCharacterStringType :: = CHARACTER STRING
39.3. Тип состоит из значений, представляющих:
а) значение символьной строки, которая может, но не обязательно, быть значением типа символьной строки АСН.1, или
б) идентификацию (по отдельности или вместе):
1) класса значений, содержащего это значение символьной строки (символьный абстрактный синтаксис), и
2) использованное кодирование (символьный синтаксис передачи) для отличия этого значения символьной строки от других значений в том же самом классе.
39.4. Неограниченный тип символьных строк имеет ассоциированный тип, который используется для обеспечения нотаций значения и подтипа для этого типа.
39.5. Ассоциированный тип для определения значения и подтипа, используя окружение автоматического тегирования, есть (с нормативными комментариями):
SEQUENCE {
identification CHOICE {
syntaxes SEQUENCE {
abstract OBJECT IDENTIFIER,
transfer OBJECT IDENTIFIER }
- - Идентификаторы объектов абстрактного синтаксиса и синтаксиса
- - передачи - -,
syntax OBJECT IDENTIFIER
- - Идентификатор объекта для класса кодирования - -,
presentation-context-id INTEGER
- - (Применяется только в среде ВОС)
- - Согласованный контекст представления идентифицирует класс
- - значения и его кодирование - -,
context-negotiation SEQUENCE {
presentation-context-id INTEGER,
transfer-syntax OBJECT IDENTIFIER }
- - (Применяется только в среде ВОС)
- - Идет процесс согласования контекста для идентификации класса
- - значения и его кодирования - -,
transfer-syntax OBJECT IDENTIFIER
- - Класс значения (например спецификация того, что оно является
- - значением типа АСН.1) зафиксирован проектировщиком приложения
- - (и, следовательно, известен как отправителю, так и получателю).
- - Этот случай предназначен главным образом для поддержки
- - выборочного-шифрования-полей (или других преобразований
- - кодирования) типов АСН.1 - -,
fixed NULL
- - Значение данных является значением фиксированного типа АСН.1
- - (и, следовательно, известно как отправителю, так и получателю)
- - },
data-value-descriptor ObjectDescriptor OPTIONAL
- - Обеспечивает человекочитаемую идентификацию класса значения - -,
string-value OCTET STRING}
(WITH COMPONENTS {
...,
data-value-descriptor ABSENT})
Примечание. Неограниченный тип символьных строк не допускает включения значения "data-value-descriptor" вместе с "identification". Однако определение ассоциированного типа отражает базовую общность, которая существует между типом "встроенное-зпд", внешним типом и неограниченным типом символьных строк.
39.6. Нотация значения должна быть нотацией значения для ассоциированного типа, в которой значение "string-value" OCTET STRING представляет собой кодирование, использующее синтаксис передачи, специфицированный в "identification".
UnrestrictedCharacterStringValue :: = SequenceValue
- - значение ассоциированного типа, определенного в 39.5
39.7. Пример неограниченного типа символьных строк приведен в C.2.8.
40.1. Нотацией для ссылки на типы, определенные в разделах 41 - 43, должна быть:
UsefulType :: = typereference
где ссылка "typereference" является одной из определенных в разделах 41 - 43 с использованием нотации АСН.1.
40.2. Теги типов "UsefulType" определены в разделах 41 - 43.
41.1. Этот тип должен указываться именем
GeneralizedTime
41.2. Тип состоит из значений, представляющих:
а) календарную дату, как определено в ИСО 8601, и
б) время дня с любой точностью, определенной в ИСО 8601, за исключением значения часов 24, которое не должно использоваться, и
в) местную поправку часов, как определено в ИСО 8601.
GeneralizedTime :: =
[UNIVERSAL 24] IMPLICIT VisibleString
со значениями VisibleString, ограничивающимися строками символов, которые являются либо:
а) строкой, представляющей календарную дату, как определено в ИСО 8601, с четырехзначным представлением года, двузначными представлениями месяца и дня, без использования разделителей, с последующей строкой, представляющей время дня, как определено в ИСО 8601, без разделителей, отличных от десятичной запятой и десятичной точки (как установлено в ИСО 8601), и без завершающего Z (как установлено в ИСО 8601), либо
в) символами из перечисления а) с последующей строкой, представляющей местную поправку часов, как определено в ИСО 8601, без разделителей.
В случае а) время представляет местное время. В случае б) время представляет всемирное время. В случае в) часть строки, сформированная как в случае а), представляет местное время
всемирное время равно
Примеры:
"19851106210627.3"
представляет местное время 21 ч 6 мин и 27,3 с 6 ноября 1985 г.
"19851106210627.3Z"
представляет указанное выше всемирное время.
"19851106210627.3-0500"
представляет местное время, как в случае а) с отставанием на 5 ч от всемирного времени.
41.4. Тег определен в 41.3.
41.5 Нотацией значения должна быть нотация значения VisibleString, определенная в 41.3.
42.1. Этот тип должен указываться именем
UTCTime
42.2. Тип состоит из значений, представляющих:
а) календарную дату,
б) время дня с точностью до минуты или секунды и
в) (факультативно) местную поправку часов.
UTCTime :: = [UNIVERSAL 23] IMPLICIT VisibleString
со значениями VisibleString, ограничивающимися строками следующих символов:
а) шесть цифр YYMMDD, где YY - две последние цифры года, MM - двузначное представление месяца (считая январь 01), DD - двузначное представление дня (от 01 до 31), и
1) четыре цифры hhmm, где hh - часы (от 00 до 23), а mm - минуты (от 00 до 59), либо
2) шесть цифр hhmmss, где hh и mm - как в случае 1), а ss - секунды (от 00 до 59), и
в) либо
1) символа Z, либо
2) одного из символов "+" или "-" с последующими цифрами hhmm, где hh - часы, а mm - минуты.
Альтернативы в случае б) позволяют варьировать точность представления времени.
В альтернативе в) 1) время является всемирным. В альтернативе в) 2) время
всемирное время равно
Пример 1 - Если местное время - 7 ч 2 января 1982 г., а всемирное - 12 ч, то значением UTCTime является либо
"8201021200Z"
либо
"8201020700-0500"
Пример 2 - Если местное время - 7 ч 2 января 2001 г., а всемирное - 12 ч, то значением UTCTime является либо
"0101021200Z"
либо
"0101020700-0500"
42.4. Тег определен в 42.3.
42.5. Нотацией значения должна быть нотация значения VisibleString, определенная в 42.3.
43.1. Этот тип должен указываться именем
ObjectDescriptor
43.2. Тип состоит из человекочитаемых текстов, которые служат для описания объектов. Текст не является недвусмысленной идентификацией объекта, но подразумевается, что идентичный текст для разных объектов есть что-то необычное.
Примечание. Рекомендуется, чтобы уполномоченные по присвоению объектам значений типа "OBJECT IDENTIFIER" присваивали также значения типа "ObjectDescriptor" этим объектам.
43.3. Тип определяется, используя АСН.1, следующим образом:
ObjectDescriptor :: = [UNIVERSAL 7] IMPLICIT GraphicString
Строка "GraphicString" содержит текст, описывающий объект.
43.4. Тег определен в 43.3.
43.5. Нотацией значения должна быть нотация значения GraphicString, определенная в 43.3.
44.1. Нотация "ConstrainedType" позволяет применять ограничение к (порождающему) типу, либо ограничивая его множество значений некоторым подтипом порождающего типа, либо (в типах "множество" или "последовательность") задавая, что отношения между компонентами применяются к значениям порождающего типа и значениям некоторого другого компонента в том же самом значении множества или последовательности. С ограничением может быть ассоциирован идентификатор исключения.
ConstrainedType :: =
Type Constraint |
TypeWithConstraint
В первой альтернативе порождающий тип есть "Type", а ограничение задается "Constraint", как определено в 44.5. Вторая альтернатива определена в 44.4.
44.2. Когда нотация "Constraint" следует за нотацией типа "множество-из" или "последовательность-из", то она применяется к типу "Type" в (самой внутренней) нотации "множество-из" или "последовательность-из", а не к типу "множество-из" или "последовательность-из".
Примечание. Например следующее ограничение "(SIZE(1..64))" применяется к VisibleString, а не к SEQUENCE OF:
NamesOfMemberNations :: = SEQUENCE OF VisibleString (SIZE(1..64))
44.2.1. Когда нотация "Constraint" следует за нотацией селективного типа, она применяется к выборочному типу, а не к типу выбранной альтернативы.
Примечание. В следующем примере ограничение (WITH COMPONENTS {..., a ABSENT}) применяется к типу CHOICE, а не к выбранному типу SEQUENCE (см. 29.1 bis).
T :: = CHOICE {
a SEQUENCE {
a INTEGER OPTIONAL,
b BOOLEAN
},
b NULL
}
V :: = a < T (WITH COMPONENTS {..., a ABSENT})
44.3. Когда нотация "Constraint" следует за нотацией "TaggedType", то интерпретация всей нотации одна и та же, независимо от того, рассматривается ли "TaggedType" или "Type" в качестве порождающего типа.
44.4. Как следствие интерпретации, установленной в 44.2, специальная нотация обеспечивается для того, чтобы ограничение применялось к типам "множество-из" или "последовательность-из". Это нотация "TypeWithConstraint":
TypeWithConstraint :: =
SET Constraint OF Type |
SET SizeConstraint OF Type |
SEQUENCE Constraint OF Type |
SEQUENCE SizeConstraint OF Type
В первой и второй альтернативах порождающий тип есть "SET OF Type", а в третьей и четвертой - "SEQUENCE OF Type". В первой и третьей альтернативах ограничение есть "Constraint" (см. 44.5), а во второй и четвертой - "SizeConstraint" (см. 48.5).
Примечание. Хотя альтернативы "Constraint" включают соответствующие альтернативы "SizeConstraint", последние, не взятые в скобки, введены для обратной совместимости с ГОСТ Р ИСО/МЭК 8824.
Constraint :: = "(" ConstraintSpec ExceptionSpec ")"
ConstraintSpec :: =
SubtypeConstraint |
GeneralConstraint
Продукция "ExceptionSpec" определяется в разделе 45. Если она не используется вместе с маркером расширения (см. раздел 47), то должна присутствовать только в том случае, когда продукция "ConstraintSpec" включает в себя ссылку "DummyReference" (см. ИСО/МЭК 8824-4, 8.3) или является ограничением "UserDefinedConstraint" (см. ИСО/МЭК 8824-3, раздел 9).
44.6. Нотация "SubtypeConstraint" является нотацией общего назначения "ElementSetSpec" (раздел 46):
SubtypeConstraint :: = ElementSetSpec
В данном контексте элементы являются значениями порождающего типа (управляющим множеством элементов является порождающий тип). В множестве должен быть по крайней мере один элемент.
45.1. В сложной спецификации АСН.1 имеется ряд мест, где существенно распознавать, что декодеры должны обрабатывать материал, который не полностью специфицирован. Такие случаи возникают, в частности, при использовании ограничения, которое определено с использованием параметра абстрактного синтаксиса (см. ИСО/МЭК 8824-4, раздел 10).
45.2. В таких случаях проектировщик приложения нуждается в идентификации действий, которые должны быть предприняты, когда нарушается некоторое зависящее от реализации ограничение. Идентификатор исключения обеспечивает недвусмысленный способ указания частей спецификации АСН.1, чтобы выделить действия, которые должны быть предприняты. Идентификатор состоит из символа "!" с последующим факультативным типом АСН.1 и значением этого типа. При отсутствии типа в качестве типа значения принимается INTEGER.
45.3. Если присутствует продукция "ExceptionSpec", то она указывает, что в стандарте имеется текст, говорящий о том, как обрабатывать нарушение ограничения, связанное с "!". Если она отсутствует, то реализаторы будут вынуждены либо идентифицировать текст, описывающий действия, которые необходимо предпринять, либо предпринимать зависящие от реализации действия, когда встретится нарушение ограничения.
45.4. Нотация "ExceptionSpec" определяется следующим образом:
ExceptionSpec :: = "!" ExceptionIdentification | empty
ExceptionIdentification :: = SignedNumber |
DefinedValue |
Type ":" Value
Первые две альтернативы обозначают идентификаторы исключения целочисленного типа. Третья альтернатива обозначает идентификатор исключения ("Value") произвольного типа ("Type").
45.5. Когда для типа установлен ряд ограничений, несколько из которых имеют идентификаторы исключений, идентификатор исключения самого внешнего ограничения должен рассматриваться как идентификатор исключения этого типа.
45.6. Когда для типов, используемых в арифметических установках, присутствует маркер расширения, идентификатор исключения игнорируется и не наследуется типом, ограниченным в результате арифметической установки.
При осуществлении арифметической установки, включающей ограничения подтипа и множества значений, в этой установке используются только абстрактные значения, определенные корнем расширения. Все экземпляры нотации значения (включая ссылки на значения), используемые в этих ограничениях, обязательно относятся к абстрактному значению корня расширения. Если на самом внешнем уровне "ElementSetSpecs" нет маркера расширения, то результат арифметической установки не является расширяемым типом.
При осуществлении арифметической установки, включающей множества информационных объектов, все информационные объекты (а не только в корне расширения) используются в этой установке. Если какое-либо множество информационных объектов, относящееся к арифметической установке, является расширяемым или на самом внешнем уровне "ElementSetSpecs" есть маркер расширения, то результат арифметической установки является расширяемым типом.
46.1. В некоторых нотациях может быть специфицировано множество элементов некоторого идентифицированного класса элементов (управляющего). В таких случаях используется нотация "ElementSetSpecs":
ElementSetSpecs :: =
RootElementSetSpec |
RootElementSetSpec "," "..." |
RootElementSetSpec "," "..." "," AdditionalElementSetSpec
RootElementSetSpec :: = ElementSetSpec
AdditionalElementSetSpec :: = ElementSetSpec
ElementSetSpec :: = Unions |
ALL Exclusions
Unions :: = Intersections |
UElems UnionMark Intersections
UElems :: = Unions
Intersections :: = IntersectionElements |
IElems IntersectionMark IntersectionElements
IElems :: = Intersections
IntersectionElements :: = Elements | Elems Exclusions
Elems :: = Elements
Exclusions :: = EXCEPT Elements
UnionMark :: = "|" | UNION
IntersectionMark :: = "
Примечания
1. Символ "
2. Старшинство операторов от старших к младшим следующее: "EXCEPT", "
3. Всякий раз, когда встречается продукция "Elements", может появиться либо ограничение без скобок (например INTEGER (1..4)), либо ограничение подтипа в скобках (например INTEGER ((1..4|9))).
4. Два оператора "EXCEPT" должны разделяться или "|", "
5. Отметим, что ((A EXCEPT B) EXCEPT C) - то же самое, что и (A EXCEPT (B | C)).
6. Элементы, которые указываются "ElementSetSpecs", являются объединением элементов, указанных "RootElementSetSpec" и "AdditionalElementSetSpec".
46.2. Элементами, образующими множество, являются:
а) если в "ElementSetSpec" выбрана первая альтернатива, - то специфицированные в "Unions" [см. б)], в противном случае - все элементы управляющего, за исключением специфицированных в нотации "Elements" для "Exclusions";
б) если в "Unions" выбрана первая альтернатива, - то специфицированные в "Intersections" [см. в)], в противном случае - элементы, специфицированные по крайней мере один раз в "UElems" или в "Intersections";
в) если в "Intersections" выбрана первая альтернатива, - то специфицированные в "IntersectionElements" [см. г)], в противном случае - элементы из специфицированных продукцией "IElems", которые также специфицированы и продукцией "IntersectionElements";
г) если в "IntersectionElements" выбрана первая альтернатива, - то специфицированные в "Elements", в противном случае - элементы, которые специфицированы в "Elems", за исключением специфицированных в "Exclusions".
46.3. Нотация "Elements" определяется следующим образом:
Elements :: =
SubtypeElements |
ObjectSetElements |
"(" ElementSetSpec ")"
Элементами, специфицированными этой нотацией, являются:
а) определенные в разделе 48, если используется альтернатива "SubtypeElements". Эта нотация должна использоваться только в том случае, когда управляющий является типом, а фактически участвующий тип будет ограничиваться далее возможностями нотации. В этом контексте управляющий называется порождающим типом;
б) определенные в ГОСТ Р ИСО/МЭК 8824-2, 12.6, если используется нотация "ObjectSetElements". Эта нотация должна использоваться только в том случае, когда управляющий является классом информационных объектов;
в) специфицированные нотацией "ElementSetSpec", если используется последняя альтернатива.
Примечание. Как и любая нотация ограничения, маркер расширения не влияет на одни правила кодирования АСН.1, такие как базовые правила кодирования, но влияет на другие, такие как упаковывающие правила кодирования.
47.1. Маркер расширения (многоточие) является указанием того, что ожидаются расширяющие дополнения. Он не делает каких-либо утверждений о том, как должны обрабатываться такие расширения, а только указывает, что при декодировании они не должны трактоваться как ошибка.
47.2. Совместное использование маркера расширения и идентификатора расширения является указанием, что ожидаются расширяющие дополнения, что они не должны при декодировании трактоваться как ошибка и что прикладные стандарты предписывают конкретные действия, которые должны быть предприняты приложением, если имеется нарушение ограничения. Рекомендуется применять эту нотацию в случаях, когда используется метод "запомнить и передать" или другая форма ретрансляции, указывая, что любые нераспознанные расширяющие дополнения должны возвращаться приложению для возможного перекодирования и ретрансляции.
47.3. Результат арифметической установки, включающей ограничения подтипа, множества значений или множества объектов, которые являются расширяемыми, описан в разделе 46.
47.4. Если в "ContainedSubtype" указан тип, определенный с расширяемым ограничением, то вновь определяемый тип не наследует маркер расширения и его расширяющие дополнения. Если вновь определяемый тип должен быть расширяемым, то маркер расширения должен быть добавлен к его "ElementSetSpecs" явным образом. Например:
A :: = INTEGER (0..10, ..., 12) - - A - расширяемый
B :: = INTEGER (A) - - B - нерасширяемый и ограничен до (0 - 10)
C :: = INTEGER (A, ...) - - C - расширяемый и ограничен до (0 - 10)
47.5. Если тип, определенный с расширяемым ограничением, ограничивается далее нотацией "ElementSetSpecs", которая не содержит маркер расширения, то ограничение получающегося типа - нерасширяемое, а тип не наследует никаких расширяющих дополнений, которые могут присутствовать в порождающем типе.
Например:
A :: = INTEGER (0..10,...) - - A - расширяемый
B :: = A (2..5) - - B - нерасширяемый
C :: = A - - C - расширяемый
47.6. Компоненты типов "множество", "последовательность" и "выбор", которые, согласно ограничению, должны отсутствовать, не могут присутствовать даже в том случае, когда тип "множество", "последовательность" или "выбор" является расширяемым.
Примечание. Внутренние ограничения типа не влияют на расширяемость.
Например:
A :: = SEQUENCE {
a INTEGER
b BOOLEAN OPTIONAL
...
}
B :: = A (WITH COMPONENTS {b ABSENT}) - - B - расширяемый, но 'b'
- - не должен присутствовать ни в каком его значении.
47.7. Когда настоящий стандарт требует различия тегов (см. 24.5, 24.6, 26.3 и 28.2), то до проведения проверки на единственность тегов должно быть осуществлено следующее преобразование.
47.7.1. Новый элемент или альтернатива (называемый "концептуально добавляемым элементом", см. 47.7.2) концептуально добавляется в точке вставки расширения, если:
а) нет маркеров расширения, но расширяемость подразумевается заголовком модуля, и тогда добавляются маркер расширения и новый элемент как первое дополнение после маркера расширения, или
б) имеется единственный маркер расширения в CHOICE, SEQUENCE или SET, и тогда новый элемент добавляется в конце CHOICE, SEQUENCE или SET непосредственно перед закрывающей скобкой, или
в) имеется два маркера расширения в CHOICE, SEQUENCE или SET и тогда новый элемент добавляется непосредственно перед вторым маркером расширения.
47.7.2. Этот концептуально добавляемый элемент служит исключительно для проверки правильности применения правил, требующих различия тегов (см. 24.5, 24.6, 26.3 и 28.2). Он концептуально добавляется после применения автоматического тегирования (если оно применяется) и раскрытия COMPONENTS OF.
47.7.3. Концептуально добавляемый элемент определяется как имеющий тег, который отличен от тегов всех обычных типов АСН.1, но который согласуется с тегами всех концептуально добавляемых элементов и с неопределенным тегом открытого типа, как специфицировано в ГОСТ Р ИСО/ МЭК 8824-2, 14.2, примечание 2.
Примечание. Правила, касающиеся единственности тегов относительно концептуально добавляемых элементов и открытого типа, вместе с правилами, требующими различия тегов (см. 24.5, 24.6, 26.3 и 28.2), являются необходимыми и достаточными, чтобы гарантировать, что:
а) любое неизвестное расширяющее дополнение может быть недвусмысленно приписано к единственной точке вставки при декодировании BER;
б) неизвестные расширяющие дополнения никогда не могут быть перепутаны с элементами OPTIONAL.
В PER эти правила достаточны, но не необходимы для гарантии указанных свойств. Тем не менее эти правила вводятся как правила АСН.1 для обеспечения независимости нотации от правил кодирования.
47.7.4. Если с этими концептуально добавленными элементами нарушаются правила, требующие различия тегов, то в спецификации была неправильно использована нотация расширения.
Примечание. Целью приведенных выше правил является установление точных ограничений, вытекающих из использования точек вставки (в частности, тех, которые не находятся в конце CHOICE, SEQUENCE или SET). Ограничения предназначены для того, чтобы гарантировать, что в BER, DER и CER можно неизвестный элемент, полученный системой версии 1, недвусмысленно приписать конкретной точке вставки. Это важно, когда обработка расширений таких добавленных элементов различна для разных точек вставки.
47.8. Примеры
47.8.1. Пример 1
A :: = SET {
a A,
b CHOICE {
c C,
d D,
...,
...
}
}
Это допустимо потому, что нет двусмысленности, так как любой добавляемый материал должен быть частью "b".
47.8.2. Пример 2
A :: = SET {
a A,
b CHOICE {
c C,
d D,
...,
...
},
...,
e E
}
Это недопустимо потому, что добавление может быть частью "b" или быть на внешнем уровне "A", и система версии 1 не сможет решить, где оно находится.
47.8.3. Пример 3
A :: = SET {
a A,
b CHOICE {
c C,
...
},
d CHOICE {
e E
...
}
}
Это недопустимо потому, что добавление может быть частью "b" или "d".
47.8.4. Могут быть построены и более сложные примеры с расширяемыми выборами в расширяемых выборах или с расширяемыми выборами в элементах последовательности, помеченных как OPTIONAL или DEFAULT, но приведенные выше правила необходимы и достаточны, чтобы гарантировать, что элемент, отсутствующий в версии 1, может быть недвусмысленно приписан системой версии 1 к ровно одной точке вставки.
Для "SubtypeElements" обеспечивается ряд различных форм нотации. Они идентифицированы ниже, а их синтаксис и семантика определяются в последующих пунктах. В таблице 6 приведена сводка того, какие нотации к каким порождающим типам могут применяться.
Таблица 6
????????????????????????????????????????????????????????????????????????????????????
? Тип ?Single?Contained?Value ?Permitted?SizeCon-?TypeCon-?Inner ?
? ?Value ? Subtype ?Range ?Alphabet ?straint ?straint ?TypeCon-?
? ? ? ? ? ? ? ?straints?
????????????????????????????????????????????????????????????????????????????????????
?Битовая строка ? Да ? Да ? Нет ? Да ? Нет ? Нет ? Нет ?
????????????????????????????????????????????????????????????????????????????????????
?Булевский ? Да ? Да ? Нет ? Нет ? Нет ? Нет ? Нет ?
????????????????????????????????????????????????????????????????????????????????????
?Выборочный ? Да ? Да ? Нет ? Нет ? Нет ? Нет ? Да ?
????????????????????????????????????????????????????????????????????????????????????
?Встроенное-здп ? Да ? Нет ? Нет ? Нет ? Нет ? Нет ? Да ?
????????????????????????????????????????????????????????????????????????????????????
?Перечислимый ? Да ? Да ? Нет ? Нет ? Нет ? Нет ? Нет ?
????????????????????????????????????????????????????????????????????????????????????
?Внешний ? Да ? Нет ? Нет ? Нет ? Нет ? Нет ? Да ?
????????????????????????????????????????????????????????????????????????????????????
?Экземпляр-из ? Да ? Да ? Нет ? Нет ? Нет ? Нет ? Да ?
????????????????????????????????????????????????????????????????????????????????????
?Целочисленный ? Да ? Да ? Да ? Нет ? Нет ? Нет ? Нет ?
????????????????????????????????????????????????????????????????????????????????????
?Вырожденный ? Да ? Да ? Нет ? Нет ? Нет ? Нет ? Нет ?
????????????????????????????????????????????????????????????????????????????????????
?Поле класса объектов ? Да ? Да ? Нет ? Нет ? Нет ? Нет ? Нет ?
????????????????????????????????????????????????????????????????????????????????????
?Идентификатор объекта? Да ? Да ? Нет ? Нет ? Нет ? Нет ? Нет ?
????????????????????????????????????????????????????????????????????????????????????
?Строка октетов ? Да ? Да ? Нет ? Да ? Нет ? Нет ? Нет ?
????????????????????????????????????????????????????????????????????????????????????
?Открытый ? Нет ? Нет ? Нет ? Нет ? Нет ? Да ? Нет ?
????????????????????????????????????????????????????????????????????????????????????
?Вещественный ? Да ? Да ? Да ? Нет ? Нет ? Нет ? Да ?
????????????????????????????????????????????????????????????????????????????????????
?Ограниченный ? Да ? Да ?Да <*>? Да ? Да ? Нет ? Нет ?
?символьных строк ? ? ? ? ? ? ? ?
????????????????????????????????????????????????????????????????????????????????????
?Последовательность ? Да ? Да ? Нет ? Нет ? Нет ? Нет ? Да ?
????????????????????????????????????????????????????????????????????????????????????
?Последовательность-из? Да ? Да ? Нет ? Да ? Нет ? Нет ? Да ?
????????????????????????????????????????????????????????????????????????????????????
?Множество ? Да ? Да ? Нет ? Нет ? Нет ? Нет ? Да ?
????????????????????????????????????????????????????????????????????????????????????
?Множество-из ? Да ? Да ? Нет ? Да ? Нет ? Нет ? Да ?
????????????????????????????????????????????????????????????????????????????????????
?Неограниченный ? Да ? Нет ? Нет ? Да ? Нет ? Нет ? Да ?
?символьных строк ? ? ? ? ? ? ? ?
????????????????????????????????????????????????????????????????????????????????????
?NumericString, PrintableString, VisibleString и UniversalString. ?
????????????????????????????????????????????????????????????????????????????????????
SubtypeElements :: =
SingleValue |
ContainedSubtype |
ValueRange |
PermittedAlphabet |
SizeConstraint |
TypeConstraint |
InnerTypeConstraints
48.2.1. Нотация для единственного значения "SingleValue" должна быть:
SingleValue :: = Value
где "Value" является нотацией значения для порождающего типа.
48.2.2. Нотация "SingleValue" специфицирует единственное значение порождающего типа, заданное "Value".
48.3.1. Нотация для содержащегося подтипа "ContainedSubtype" должна быть:
ContainedSubtype :: = Includes Type
Includes :: = INCLUDES | empty
Альтернатива "empty" для продукции "Includes" не должна использоваться, когда "Type" в "ContainedSubtype" является нотацией для вырожденного типа.
48.3.2. Нотация "ContainedSubtype" специфицирует все значения в порождающем типе, которые имеются и в "Type". Требуется, чтобы тип "Type" был совместим с порождающим типом, как установлено в F.6.3.
48.4.1. Нотация для диапазона значений "ValueRange" должна быть:
ValueRange :: = LowerEndpoint ".." UpperEndpoint
48.4.2. Нотация "ValueRange" специфицирует все значения в диапазоне, который определяется заданием значений конечных точек диапазона. Эта нотация может применяться только для целочисленных и вещественных типов и некоторых ограниченных типов символьных строк PermittedAlphabet (только BMPString, IA5String, NumericString, PrintableString, VisibleString и UniversalString).
Примечание. При создании подтипов "PLUS-INFINITY" превышает все значения "NumericReal", а "MINUS-INFINITY" меньше всех значений "NumericReal".
48.4.3. Каждая конечная точка диапазона является либо закрытой (в таком случае эта конечная точка задана), либо открытой (в таком случае эта конечная точка не задана). Для открытой точки спецификация включает символ "меньше чем" ("<"):
LowerEndpoint :: = LowerEndValue | LowerEndValue "<"
UpperEndpoint :: = UpperEndValue | "<" UpperEndValue
48.4.4. Конечная точка может быть не задана, в таком случае диапазон простирается в этом направлении настолько, насколько допускает порождающий тип:
LowerEndValue :: = Value | MIN
UpperEndValue :: = Value | MAX
Примечание. Когда "ValueRange" используется как ограничение "PermittedAlphabet", "LowerEndValue" и "UpperEndValue" должны быть размером 1.
48.5.1. Нотация для ограничения размера "SizeConstraint" должна быть:
SizeConstraint :: = SIZE Constraint
48.5.2. Нотация "SizeConstraint" может применяться только к типам битовых строк, строк октетов, символьных строк, "множество-из" или "последовательность-из".
48.5.3. Продукция "Constraint" специфицирует допустимые целые значения для длины заданных значений и имеет вид любого ограничения, которое может применяться к следующему порождающему типу:
INTEGER (0..MAX)
Продукция "Constraint" должна использовать альтернативу "SubtypeConstraint" для "ConstraintSpec".
48.5.4. Единица измерения зависит от порождающего типа следующим образом:
Тип Единица измерения
битовая строка бит
строка октетов октет
символьная строка символ
множество-из значение компонента
последовательность-из значение компонента
Примечание. Подсчет количества символов в данном разделе для определения размера значения символьной строки следует четко отличать от подсчета октетов. Подсчет символов следует интерпретировать в соответствии с определением совокупности символов, используемой в типе, в частности, относительно ссылок на стандарты, таблицы или регистрационные номера в регистре, которые появляются в таком определении.
48.6.1. Нотация ограничения типа "TypeConstraint" должна быть:
TypeConstraint :: = Type
48.6.2. Эта нотация применяется только к нотации открытого типа и ограничивает открытый тип значениями "Type".
48.7.1. Нотация для допустимого алфавита "PermittedAlphabet" должна быть:
PermittedAlphabet :: = FROM Constraint
48.7.2. Нотация "PermittedAlphabet" специфицирует все значения, которые могут быть построены с использованием подалфавита порождающей строки. Эта нотация может применяться только для ограниченных типов символьных строк.
48.7.3. Ограничение "Constraint" является любым, которое может применяться для порождающего типа (см. таблицу 6), за исключением использующих альтернативу "SubtypeConstraint" для "ConstraintSpec". Подалфавит включает символы, появляющиеся в одном или нескольких значениях порождающего типа строки, которые допускаются ограничением "Constraint".
48.8.1. Нотация для внутренних подтипов "InnerTypeConstraints" должна быть:
InnerTypeConstraints :: =
WITH COMPONENT SingleTypeConstraint |
WITH COMPONENTS MultipleTypeConstraints
48.8.2. Нотация "InnerTypeConstraints" специфицирует только те значения, которые удовлетворяют совокупности ограничений на присутствие, и/или значения компонентов порождающего типа. Значение порождающего типа не специфицировано, если оно не удовлетворяет всем ограничениям, явно выраженным или подразумеваемым (см. 48.8.6). Эта нотация может применяться к выборочному типу, типам "множество-из", "последовательность-из", "множество" или "последовательность".
Примечание. Нотация "InnerTypeConstraints", применяемая к типу "множество" или "последовательность", игнорируется преобразованием COMPONENTS OF (см. 24.4 и 26.2).
48.8.3. Для типов, которые определены в терминах единственного другого (внутреннего) типа ("множество-из" и "последовательность-из"), ограничение принимает вид спецификации значения подтипа. Нотацией для такого случая является "SingleTypeConstraint":
SingleTypeConstraint :: = Constraint
Ограничение "Constraint" определяет подтип единственного другого (внутреннего) типа. Значение порождающего типа специфицировано, если и только если каждое внутреннее значение относится к подтипу, полученному применением "Constraint" к внутреннему типу.
48.8.4. Для типов, которые определены в терминах нескольких других (внутренних) типов (выборочный, "множество" и "последовательность"), может быть несколько ограничений на эти внутренние типы. Нотацией для такого случая является "MultipleTypeConstraints":
MultipleTypeConstraints :: = FullSpecification | PartialSpecification
FullSpecification :: = "{" Type Constraints "}"
PartialSpecification :: = "{" "..." "," TypeConstraints "}"
TypeConstraints :: =
NamedConstraint |
NamedConstraint "," TypeConstraints
NamedConstraint :: =
identifier ComponentConstraint
48.8.5. Продукция "TypeConstraints" содержит список ограничений на типы компонентов порождающего типа. Для типа "последовательность" ограничения должны появляться упорядочено. Внутренний тип, к которому применяется ограничение, идентифицируется с помощью его идентификатора. Для данного компонента должно быть не более одной продукции "NamedConstraint".
48.8.6. Нотация "MultipleTypeConstraints" включает в себя либо нотацию "FullSpecification", либо нотацию "PartialSpecification". Когда используется "FullSpecification", подразумевается присутствие ограничения "ABSENT" на все внутренние типы, которые могут быть ограничены тем, что будут отсутствовать (см. 48.8.9) и не перечислены явно. Когда используется "PartialSpecification", то нет подразумеваемых ограничений, и любой внутренний тип может быть опущен из списка.
48.8.7. Конкретный внутренний тип может быть ограничен в терминах его присутствия (в значениях порождающего типа), его значения, или и того, и другого. Нотацией является "ComponentConstraint":
ComponentConstraint :: = ValueConstraint PresenceConstraint
48.8.8. Ограничение на значение внутреннего типа выражается нотацией "ValueConstraint":
ValueConstraint :: = Constraint | empty
Ограничение удовлетворяется значением порождающего типа только в том случае, если внутреннее значение относится к подтипу, заданному ограничением "Constraint", применяемым к внутреннему типу.
48.8.9. Ограничение на присутствие внутреннего типа должно быть выражено нотацией "PresenceConstraint":
PresenceConstraint :: = PRESENT | ABSENT | OPTIONAL | empty
Смысл этих альтернатив и ситуации, в которых они допустимы, определены в 48.8.9.1 - 48.8.9.3.
48.8.9.1. Если порождающий тип является последовательностью или множеством, то тип компонента, помеченный "OPTIONAL", может быть ограничен как "PRESENT" (и в этом случае ограничение удовлетворяется тогда и только тогда, когда соответствующее значение компонента присутствует) или как "ABSENT" (и в этом случае ограничение удовлетворяется тогда и только тогда, когда соответствующее значение компонента отсутствует), или как "OPTIONAL" (и в этом случае нет ограничений на присутствие соответствующего значения компонента).
48.8.9.2. Если порождающий тип является выборочным, то тип компонента может быть ограничен как "ABSENT" (и в этом случае ограничение удовлетворяется тогда и только тогда, когда соответствующий тип компонента не используется в значении) или как "PRESENT" (и в этом случае ограничение удовлетворяется тогда и только тогда, когда соответствующий тип компонента используется в значении); для данного типа не должно быть более одного ключевого слова "PRESENT" в продукции "MultipleTypeConstraints".
Примечание. Поясняющий пример см. в C.4.6.
48.8.9.3. Смысл пустой альтернативы для "PresenceConstraint" зависит от того, используется "FullSpecification" или "PartialSpecification":
а) в "FullSpecification" она эквивалентна ограничению "PRESENT" для компонентов множества или последовательности, помеченных "OPTIONAL", и не накладывает других ограничений в противном случае;
б) в "PartialSpecification" никаких ограничений не накладывается.
(обязательное)
ИСПОЛЬЗОВАНИЕ НОТАЦИИ АСН.1-90
Термин АСН.1-90 используется для указания, что нотация определена в ГОСТ Р ИСО/МЭК 8824-93. Термин текущая нотация АСН.1 используется для нотации, определенной в настоящем стандарте.
На дату публикации настоящего стандарта продолжает действовать ГОСТ Р ИСО/МЭК 8824-93 и соответствующий ему международный стандарт ИСО/МЭК 8824-90. Действие последнего зависит от решения ИСО/МЭК/СТК1/ПК21.
Продолжение действия прежней спецификации дает пользователям время на замену характеристик (в частности, ANY и использование макронотации) нотации АСН.1-90 текущей нотацией АСН.1. (Это может быть сделано без изменений битов в строках).
Как в АСН.1-90, так и в текущей нотации АСН.1 специфицирована семантическая конструкция верхнего уровня, которой является модуль АСН.1. Пользователь АСН.1 создает совокупность модулей АСН.1 и может импортировать определения из других модулей АСН.1.
Для любого данного модуля требуется, чтобы используемая нотация (полностью) соответствовала либо АСН.1-90, либо текущей нотации АСН.1, и пользователь спецификации должен ясно идентифицировать (указанием соответствующего стандарта), какая нотация используется для каждого модуля, текстуально включенного в спецификацию пользователя.
Может случиться так, что пользователь захочет модифицировать часть модуля с использованием новой нотации, но оставить другие части в старой нотации. Это может быть достигнуто (только) путем расщепления модуля на два других модуля.
Когда модуль соответствует нотации АСН.1-90, ссылки на типы и значения могут быть импортированы из модуля, определенного с использованием текущей нотации. Такие типы и значения должны быть ассоциированы с типами, которые могут быть определены с использованием нотации АСН.1-90. Например модуль, написанный с использованием нотации АСН.1-90, не может импортировать значение типа UniversalString, так как этот тип определен в текущей нотации, но не в АСН.1-90; однако он может импортировать значения, типы которых, например, INTEGER, IA5String и т.п.
Когда модуль соответствует текущей нотации АСН.1, ссылки на типы и значения могут быть импортированы из модуля, определенного с использованием нотации АСН.1-90. Макронотация АСН.1 не может быть импортирована. Нотация значения для импортированного типа должна использоваться в импортирующем модуле, только если присутствуют идентификаторы для значений SET, SEQUENCE и CHOICE, использованных в значении нотации, и если в значении нотации не требуется значение типа ANY. Ограничение внутреннего типа не должно применяться к импортированному типу, если компонент, который должен быть ограничен, не имеет идентификатора.
При модификации модуля (первоначально написанного в согласно нотации АСН.1-90) для соответствия текущей нотации следует учитывать следующие моменты.
а) Всем компонентам SET, SEQUENCE и CHOICE должны быть даны идентификаторы, не двусмысленные в данном экземпляре SET, SEQUENCE и CHOICE, и такие же идентификаторы должны быть включены в нотацию значения.
Примечание 1. Значение нотации для типа CHOICE содержит двоеточие (":").
б) Все использования ANY и ANY DEFINED BY должны быть обеспечены подходящими определениями классов информационных объектов с заменой ANY и ANY DEFINED BY (и указанных компонентов) соответствующими ссылками на поля этого класса объектов. В большинстве случаев спецификация может быть улучшена за счет удачной вставки табличных ограничений и ограничений отношений компонентов. Во многих случаях спецификация может быть еще более улучшена, если табличное ограничение или ограничение отношений компонентов осуществляется как параметр типа.
в) Макроопределения должны быть заменены определением класса информационных объектов, параметризованным типом или параметризованным значением. Если раздел WITH SYNTAX удачно спроектирован в определении класса информационных объектов, то нотация, используемая для определения объектов этого класса, может быть сделана очень похожей на нотацию, определенную старым использованием макронотации.
г) Все экземпляры использования макронотации должны быть заменены либо эквивалентными определениями информационных объектов, либо ссылками на эквивалентные типы "ObjectClassFieldType", параметризованные типы или параметризованные значения. В большинстве случаев спецификация информационных объектов может быть существенно улучшена группировкой таких определений в множества информационных объектов и ясным указанием, является ли обязательной поддержка всех информационных объектов множества, должны ли принимающие реализации приспосабливаться к зависящим от реализации расширениям этого множества информационных объектов и, если это так, как они должны обрабатывать полученные "неизвестные" значения. Может оказаться желательным рассмотреть возможность, что в последующей версии спецификации пользователя может быть расширено множество информационных объектов и дано руководство нынешним разработчикам, как такие расширения должны трактоваться.
д) Все появления EXTERNAL должны быть тщательно рассмотрены; хотя эта нотация остается допустимой в текущей нотации АСН.1, спецификация пользователя может быть улучшена следующим образом:
1) Рассмотрите использование нотации INSTANCE OF (предпочтительно с табличным ограничением в качестве параметра типа, как обсуждалось выше для ANY и ANY DEFINED BY) вместо нотации EXTERNAL; во многих случаях это не изменит битов в строке.
2) Когда сохраняется EXTERNAL, использование внутренних подтипов ассоциированного типа (см. 33.5) может помочь придать точность спецификации тому, используются ли идентификаторы контекстов представления или это не допускается. Здесь же применимы предшествующие комментарии (см. раздел 33), которые дают руководство о том, какие значения EXTERNAL должны поддерживаться и что должны делать реализации, если получены неподдерживаемые значения.
3) Рассмотрите замену
CHOICE { external EXTERNAL, embedded-pdv EMBEDDED PDV }
(с использованием внутренних подтипов, если это подходит) для того, чтобы обеспечить постепенный переход распределенных приложений к текущей нотации. Это может повлиять на биты в строке и обычно может быть сделано как часть изменения версии протокола. Использование EMBEDDED PDV (практически для новой спецификации) обычно дает большую гибкость, как можно увидеть из сравнения ассоциированных типов; более того, всеми правилами кодирования, определенными в ИСО/МЭК 8825-1, EMBEDDED PDV кодируется более эффективно, чем EXTERNAL.
е) Может оказаться возможным улучшить удобочитаемость нотации в существующих модулях АСН.1 (без изменения битов в строке) вставкой AUTOMATIG TAGS в заголовок модуля и удалением некоторых или всех тегов.
Примечание 2. Это следует делать с осторожностью и пониманием метода действия автоматического тегирования, так как если этот прием использовать некорректно, биты в строке изменятся.
ж) Если AUTOMATIG TAGS не применяется в существующих модулях так, как описано в е), то нежелательно добавлять определения новых типов в существующий модуль, а лучше создать новый модуль (с автоматическим тегированием) для определений новых типов. Это позволяет использовать преимущества автоматического тегирования без изменения битов в строке.
и) Следует уделить внимание полям, содержащим символьные строки, и посмотреть, нельзя ли задействовать нотации CHARACTER STRING, BMPString или UniversalString. Однако обычно это изменит биты в строке и может быть проведено как часть изменения версии.
к) Необходимо добавить идентификаторы "mantissa", "base", "exponent" ко всем нотациям вещественных значений, которые используют альтернативу "NumericRealValue" в продукции "RealValue". Рассмотрение должно ограничиваться значениями "base" 2 и 10 в нотации типа.
В общем случае возможно существенное улучшение удобочитаемости, эффективности, точности и гибкости за счет использования новой нотации АСН.1 (в частности, если использовать все преимущества табличных ограничений, ограничений связи компонентов и параметризации, а также новые типы символьных строк). Всем пользователям АСН.1-90 необходимо осуществить переход на новую нотацию АСН.1 либо при пересмотре своих спецификаций, либо как самостоятельное действие, если такой пересмотр не предвидится.
В общем случае дополнение существующих модулей с использованием нотации, не соответствующей текущей нотации АСН.1, рассматривается как ошибка, даже если ссылка на спецификации АСН.1-90 сохраняется в таких модулях. В частности, запрещается использование макронотации, ANY, ANY DEFINED BY, a также новых конструкций SET, SEQUENCE и CHOICE без недвусмысленных идентификаторов.
(обязательное)
ПРИСВОЕНИЕ ЗНАЧЕНИЙ ИДЕНТИФИКАТОРОВ ОБЪЕКТОВ
В настоящем стандарте присвоены следующие значения:
Раздел Значение идентификатора объекта
36.3 { joint-iso-itu-t asn1 (1) specification (0) characterStrings (1)
numericString (0) }
Значение описателя объекта
"NumericString ASN.1 type"
Раздел Значение идентификатора объекта
36.5 { joint-iso-itu-t asn1 (1) specification (0) characterStrings (1)
printableString (1) }
Значение описателя объекта
"PrintableString ASN.1 type"
Раздел Значение идентификатора объекта
36.1 { joint-iso-itu-t asn1 (1) specification (0) modules (0)
iso10646 (0) }
Значение описателя объекта
"ASN1 character Module"
(справочное)
ПРИМЕРЫ И УКАЗАНИЯ
Настоящее приложение содержит примеры использования АСН.1 при описании (гипотетических) структур данных. Оно также содержит указания или руководства по использованию различных характеристик АСН.1. Если не оговорено противное, то принимается окружение автоматического тегирования AUTOMATIG TAGS.
Использование АСН.1 иллюстрируется на примере простейшей гипотетической персональной записи.
C.1.1. Неформальное описание персональной записи
Структура персональной записи и значения для конкретного лица показаны ниже.
Name (имя): John P Smith
Title (должность): Director
Employee Number (табельный номер): 51
Date of Hire (дата приема на работу): 17 сентября 1971
Name of Spouse (имя супруги): Mary T Smith
Number of Children (число детей): 2
Child Information (информация о детях)
Name (имя): Ralph T Smith
Date of Birth (дата рождения): 11 ноября 1957
Child Information (информация о детях)
Name (имя): Susan B Jones
Date of Birth (дата рождения): 17 июля 1959
C.1.2. Описание АСН.1 структуры записи
Структура каждой персональной записи ниже описана формально с использованием стандартной нотации для типов данных:
PersonnelRecord :: = [APPLICATION 0] SET
{ name Name,
title VisibleString,
number EmployeeNumber,
dateOfHire Date,
nameOfSpouse Name,
children SEQUENCE OF Childlnformation DEFAULT {}
}
Childlnformation :: = SET
{ name Name,
dateOfBirth Date,
}
Name :: = [APLICATION 1] SEQUENCE
{ givenName VisibleString,
initial VisibleString,
familyName VisibleString,
}
EmployeeNumber :: = [APLICATION 2] INTEGER
Date :: = [APLICATION 3] VisibleString
Данный пример иллюстрирует аспекты синтаксического анализа АСН.1. Синтаксическая конструкция "DEFAULT" может применяться только для компонента "SEQUENCE" или "SET", но не может применяться к элементу "SEQUENCE OF". Таким образом, "DEFAULT {}" в "PersonnelRecord" применяется к "children", а не к "ChildInformation".
C.1.3. Описание АСН.1 значения записи
Значение для персональной записи Джона Смита ниже описано формально с использованием стандартной нотации для значений данных:
{ name {givenName "John", initial "P", familyName "Smith"},
title "Director",
number 51,
dateOfHire "19710917",
nameOfSpouse {givenName "Mary", initial "T", familyName "Smith"},
children
{ name {givenName "Ralph", initial "T", familyName "Smith"},
dateOfBirth "19571111"},
{name {givenName "Susan", initial "B", familyName "Jones"},
dateOfBirth "19590717"}
}
}
Типы данных и формальная нотация, определенные в настоящем стандарте, являются гибкими и позволяют проектировать широкий диапазон протоколов. Однако эта гибкость иногда может приводить к путанице, особенно когда нотация используется впервые. Данное приложение является попыткой минимизировать возможную путаницу и дает руководство (и примеры) использования нотации. Для каждого встроенного типа приводится одно или несколько указаний по его использованию. Типы символьных строк (например, VisibleString) и типы, определенные в разделах 41 - 43, здесь не рассматриваются.
C.2.1. Булевский тип
C.2.1.1. Булевский тип используется для моделирования логических значений, например ответов да-нет на поставленные вопросы.
Пример
Employed :: = BOOLEAN
C.2.1.2. При назначении ссылочного имени булевскому типу выбирается то имя, которое описывает состояние "истинно".
Пример
Married :: = BOOLEAN - - женат
но не
MaritalStatus :: = BOOLEAN - - семейное положение
C.2.2. Целочисленный тип
C.2.2.1. Целочисленный тип используется для моделирования значений (практически не ограниченных) кардинальных или целочисленных переменных.
Пример
CheckingAccountBalance :: = INTEGER - - баланс в центах,
- - отрицательное значение означает перерасход
balance CheckingAccountBalance :: = 0
C.2.2.2. Максимальное и минимальное допустимые значения целочисленного типа определяются как поименованные числа.
Пример
DayOfTheMonth :: = INTEGER {first (1), last (31)}
today DayOfTheMonth :: = first
unknown DayOfTheMonth :: = 0
Поименованные числа "first" и "last" выбраны из-за их семантического значения, но не исключают возможности значений DayOfTheMonth, меньших 1, больших 31 или в интервале 1 - 31.
Для того чтобы ограничить значения DayOfTheMonth только лишь значениями "first" и "last" следует писать:
DayOfTheMonth :: = INTEGER {first (1), last (31)} (first | last)
Для того чтобы ограничить значения DayOfTheMonth значениями от 1 до 31, следует писать:
DayOfTheMonth :: = INTEGER {first (1), last (31)} (first .. last)
dayOfTheMonth DayOfTheMonth :: = 4
C.2.3. Перечислимый тип
C.2.3.1. Перечислимый тип используется для моделирования значений переменных с тремя и более состояниями. Значения присваиваются, начиная с нуля, если единственным ограничением является их отличие друг от друга.
Пример
DayOfTheWeek :: = ENUMERATED{sunday (0), monday (1), tuesday (2),
wednesday (3), thursday (4), friday (5), saturday (6)}
- - Дни недели: воскресенье (0), понедельник (1), вторник (2),...
firstDayOfTheWeek :: = sunday
Хотя перечисления "sunday", "monday" и т.д. выбраны из-за их семантического смысла, DayOfTheWeek ограничивается только этими значениями. Более того, могут быть присвоены только значения "sunday", "monday" и т.д., а эквивалентные целочисленные значения недопустимы.
C.2.3.2. Расширяемый перечислимый тип используется для моделирования значений переменной, которая в настоящее время имеет два состояния, но может иметь дополнительные состояния в последующих версиях протокола.
Пример
Marital Status :: = ENUMERATED {single, married}
- - Первая версия записи
- - семейного положения: одинокий, женатый
в предвидении
MaritalStatus :: = ENUMERATED{single, married, ..., widowed}
- - Вторая версия записи
- - семейного положения: одинокий, женатый, вдовый
и далее
MaritalStatus :: = ENUMERATED{single, married, ..., widowed,
divorced}
- - Третья версия записи
- - семейного положения: одинокий, женатый, вдовый,
разведенный
C.2.4. Действительный тип
C.2.4.1. Действительный тип используется для моделирования приближенных чисел.
Пример
AnglelnRadians :: = REAL - - угол в радианах
pi REAL:: = {mantissa 3141592653589793238462643383279, base 10,
exponent -30}
C.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 1}
C.2.5. Битовая строка
C.2.5.1. Битовая строка используется для моделирования двоичных данных, формат и длина которых не заданы или заданы где-либо в другом месте, а длина в битах не обязательно кратна восьми.
Пример
G3FacsimilePage :: = BIT STRING
- - последовательность битов, соответствующая Рекомендации
MKKT T. 4
image G3FacsimilePage :: = '100110100100001110110'B
trailer BIT STRING :: = '0123456789ABCDEF'H
body1 G3FacsimilePage:: = '1101'B
body2 G3FacsimilePage:: = '1101000'B
Нотации "body1" и "body2" являются разными абстрактными значениями, так как завершающие нулевые биты являются значащими (так как отсутствует конструкция "NamedBitList" в определении G3FacsimilePage).
C.2.5.2. Битовая строка с ограничением размера используется для моделирования значений битовых полей фиксированного размера.
Пример
BitField :: = BIT STRING (SIZE (12))
map1 BitField :: = '100110100100'B
map2 BitField :: = '9A4'H
map3 BitField :: = '1001101001'B
- - Недопустимо - нарушено ограничение размера
Нотации "map1" и "map2" являются одинаковыми абстрактными значениями, так как завершающие четыре нулевых бита в "map2" не являются значащими.
C.2.5.3. Битовая строка используется для моделирования значений типа bit map - упорядоченной совокупности логических переменных, указывающей, выполнено ли конкретное условие для каждого соответствующего объекта упорядоченной совокупности объектов.
DaysOfTheWeek :: = BIT STRING {
sunday (0), monday (1), tuesday (2),
wednesday (3), thursday (4), friday (5),
saturday (6)} (SIZE (0 .. 7))
- - Дни недели: воскресенье (0), понедельник (1), вторник (2), ...
sunnyDaysLastWeek1 DaysOfTheWeek :: = (sunday, monday, wednesday}
- - Солнечные дни на последней неделе:
- - воскресенье, понедельник, среда
sunnyDaysLastWeek2 DaysOfTheWeek :: = '1101'B
sunnyDaysLastWeek3 DaysOfTheWeek :: = '1101000'B
sunnyDaysLastWeek4 DaysOfTheWeek :: = '11010000'B
- - Недопустимо - нарушено ограничение размера
Если значение битовой строки короче 7 бит, то отсутствующие биты указывают пасмурный день, следовательно первые три приведенные нотации имеют одно и то же абстрактное значение.
C.2.5.4. Битовая строка используется для моделирования значений типа bit map - упорядоченной, фиксированного размера совокупности логических переменных, указывающей, выполнено ли конкретное условие для каждого соответствующего объекта упорядоченной совокупности объектов.
DaysOfTheWeek :: = BIT STRING {
sunday (0), monday (1), tuesday (2),
wednesday (3), thursday (4), friday (5),
saturday (6)} (SIZE (7))
- - Дни недели: воскресенье (0), понедельник (1), вторник (2), ...
sunnyDaysLastWeek1 DaysOfTheWeek :: = {sunday, monday, wednesday}
- - Солнечные дни на последней неделе:
- - воскресенье, понедельник, среда
sunnyDaysLastWeek2 DaysOfTheWeek :: = '1101'B
- - Недопустимо - нарушено ограничение размера
sunnyDaysLastWeek3 DaysOfTheWeek :: = '1101000'B
sunnyDaysLastWeek4 DaysOfTheWeek :: = '11010000'B
- - Недопустимо - нарушено ограничение размера
Первая и третья нотации имеют одно и то же абстрактное значение.
C.2.5.5. Битовая строка с поименованными битами используется для моделирования значений совокупности связанных логических переменных.
Пример
PersonalStatus :: = BIT STRING
{married (0), employed (1), veteran (2), collegeGraduate (3)}
- - Личный статус: женат, работающий, ветеран, выпускник колледжа
billClinton PersonalStatus :: = (married, employed, collegeGraduate)
hillaryClinton PersonalStatus :: = '110100'B
Нотации "billClinton" и "hillaryClinton" имеют одно и то же абстрактное значение.
C.2.6. Строка октетов
C.2.6.1. Строка октетов используется для моделирования двоичных данных, формат и длина которых не заданы или заданы где-либо в другом месте, а длина в битах кратна восьми.
Пример
G4FacsimileImage :: = OCTET STRING
- - последовательность октетов,
- - соответствующая Рекомендациям MKKTT T. 5 и T. 6
image G4FacsimilePage :: = '3FE2EBAD471005'H
C.2.6.2. Использование ограниченной символьной строки предпочтительнее строки октетов, когда обе из них приемлемы.
Пример
Surname :: = PrintableString
president Surname :: = "Clinton"
C.2.7. Строки UniversalString и BMPString
Тип BMPString используется для моделирования любых строк информации, полностью состоящих из символов базовой многоязычной плоскости (BMP) ИСО/МЭК 10646-1, а тип UniversalString - для моделирования строк, состоящих из символов ИСО/МЭК 10646-1, не входящих в BMP.
C.2.7.1. Для обозначения уровня реализации, накладывающего ограничения на использование комбинированных символов, используются обозначения "Level1" и "Level2".
Пример
RussianName :: = Cyrillic (Level1)
- - В RussianName не используются комбинированные символы
SaudiName :: = BasicArabic (
) - - В SaudiName используется подмножество комбинированных символов
C.2.7.2. Совокупность может быть расширена до выбранного подмножества путем использования нотации "UnionMark" (см. раздел 44).
Пример
KatakanaAndBasicLatin :: = UniversalString (FROM(Katakana | BasicLatin))
Неограниченный тип символьных строк используется для моделирования любых строк информации, которые не могут быть смоделированы ни одним из ограниченных типов символьных строк. Необходимо гарантировать спецификацию репертуара символов и их кодирования в октетах.
Пример
PackedBCDString :: = CHARACTER STRING (WITH COMPONENTS{ identification
(WITH COMPONENTS{fixed PRESENT})
- - Абстрактным синтаксисом и синтаксисом передачи должны быть
- - определяемые ниже packedBCDStringAbstractSyntax
- - и packedBCDStringTransferSyntax соответственно
})
- - Значение идентификатора объекта для символьного абстрактного
- - синтаксиса (набора символов),
- - алфавитом которого являются цифры от 0 до 9
packedBCDStringAbstractSyntaxId OBJECT IDENTIFIER :: =
{joint-iso-itu-t xxx (999) yyy (999) zzz (999) packedBCD (999)
charSet (0)}
- - Значение идентификатора объекта для символьного синтаксиса
- - передачи, который упаковывает по две
- - цифры в октет; цифры кодируются от 0000 до 1001; 1111 используется
- - для заполнения октета.
packedBCDStringTransferSyntaxId OBJECT IDENTIFIER :: =
{joint-iso-itu-t xxx (999) yyy (999) zzz (999) packedBCD (999)
characterTransferSyntax (1)}
- - Кодирование packedBCDString будет содержать только определенное
- - кодирование символов, с любой
- - необходимой длиной поля, а в случае BER - с передающим тег полем.
- - Значения идентификаторов объектов не передаются, так как должно
- - быть задано "fixed".
Примечание. По правилам кодирования не обязательно кодировать значения типа CHARACTER STRING в форме, которая всегда включает в себя значения идентификаторов объектов, хотя они гарантируют, что абстрактное значение сохраняется при кодировании.
C.2.9. Вырожденный тип
Вырожденный тип null используется для указания отсутствия компонента последовательности.
Пример
PatientIdentifier :: = SEQUENCE {
name VisibleString,
roomNumber CHOICE {
room INTEGER,
outPatient NULL - - если пациент выписан - -
}
}
lastPatient PatientIdentifier :: = {
name "Jane Doe",
roomNumber outPatient : NULL
}
C.2.10. Последовательность и последовательность-из
C.2.10.1. Тип "последовательность-из" используется для моделирования совокупности переменных, тип которых один и тот же, количество велико или непредсказуемо, а порядок - существенен.
Пример
NamesOfMemberNations :: = SEQUENCE OF VisibleString
- - в алфавитном порядке
firstTwo NamesOfMemberNations :: = {"Australia", "Austria"}
C.2.10.2. Тип "последовательность" используется для моделирования совокупности переменных, тип которых один и тот же, количество известно и невелико, а порядок - существенен, при условии, что введенная разметка совокупности вряд ли изменится в последующих версиях протокола.
Пример
NamesOfOfficers :: = SEQUENCE {
president VisibleString,
vicePresident VisibleString,
secretary VisibleString}
- - Перечень официальных лиц: президент, вице-президент, секретарь
acmeCorp NamesOfOfficers :: =
president "Jane Doe",
vicePresident "John Doe",
secretary "Joe Doe"}
C.2.10.3. Тип "последовательность" используется для моделирования совокупности переменных, типы которых различны, количество известно и невелико, а порядок - существенен, при условии, что введенная разметка совокупности вряд ли изменится в последующих версиях протокола.
Пример
Credentials :: = SEQUENCE {
userName VisibleString,
password VisibleString,
accountNumber INTEGER}
C.2.10.4. Расширяемый тип "последовательность" используется для моделирования совокупности переменных, порядок которых существенен, количество их в настоящий момент известно и невелико, но ожидается, что оно должно возрасти.
Пример
Record :: = Sequence { - - Первая версия Record
userName VisibleString,
password VisibleString,
accountNumber INTEGER,
...,
...
}
в предвидении
Record :: = Sequence { - - Вторая версия Record
userName VisibleString,
password VisibleString,
accountNumber INTEGER,
...,
[[ - - Расширяющее дополнение к второй версии
lastLoggedIn GeneralizedTime OPTIONAL,
minutesLastLoggedIn INTEGER
]],
...
}
и далее
Record :: = Sequence { - - Третья версия Record
userName VisibleString,
password VisibleString,
accountNumber INTEGER,
...,
[[ - - Расширяющее дополнение к второй версии
lastLoggedIn GeneralizedTime OPTIONAL,
minutesLastLoggedIn INTEGER
]],
[[ - - Расширяющее дополнение к третьей версии
certificate Certificate,
thumb ThumbPrint OPTIONAL
]],
...
}
C.2.11. Множество и множество-из
C.2.11.1. Тип "множество" используется для моделирования совокупности переменных, количество которых известно и невелико, а порядок - не существенен. Если не используется автоматическое тегирование, то каждая переменная идентифицируется контекстно зависимым тегированием, как показано ниже. (При автоматическом тегировании теги необязательны.)
Пример
UserName :: = SET {
personalName [0] VisibleString,
organizationName [1] VisibleString,
countryName [2] VisibleString }
- - Имя пользователя: личное имя, название организации, название страны
user UserName :: = {
countryName "Nigeria",
personalName "Jonas Maruba",
organizationName "Meteorology, Ltd."}
C.2.11.2. Тип "множество" с ключевым словом "OPTIONAL" используется для моделирования совокупности переменных, являющейся (собственным или несобственным) подмножеством другой совокупности переменных, количество которых известно и разумно мало, а порядок - не существенен. Если не используется автоматическое тегирование, то каждая переменная идентифицируется контекстно зависимым тегированием, как показано ниже. (При автоматическом тегировании теги необязательны).
UserName :: = SET {
personalName [0] VisibleString,
organizationName [1] VisibleString OPTIONAL
- - по умолчанию - местная организация - -,
countryName [2] VisibleString OPTIONAL
- - по умолчанию - данная страна - - }
C.2.11.3. Расширяемый тип "множество" используется для моделирования совокупности переменных, разметка которой, вероятно, изменится в последующих версиях протокола. В следующем примере принято, что в определении модуля задано AUTOMATIC TAGS.
Пример
UserName :: = SET { - - Первая версия UserName
personalName VisibleString,
organizationName VisibleString OPTIONAL,
countryName VisibleString OPTIONAL,
...,
...
}
user UserName :: = {personalName "Jonas Maruba"}
в предвидении
UserName :: = SET { - - Вторая версия UserName
personalName VisibleString,
organizationName VisibleString OPTIONAL,
countryName VisibleString OPTIONAL,
...,
[[ - - Расширяющее дополнение к второй версии
intenetEmailAddress VisibleString,
faxNumber VisibleString OPTIONAL
]],
...
}
user UserName :: = {
personalName "Jonas Maruba",
intenetEmailAddress "jonas@meteor.ngo.com"
}
и позже
UserName :: = SET { - - Третья версия UserName
personalName VisibleString,
organizationName VisibleString OPTIONAL,
countryName VisibleString OPTIONAL,
...,
[[ - - Расширяющее дополнение к второй версии
intenetEmailAddress VisibleString,
faxNumber VisibleString OPTIONAL
]],
phoneNumber VisibleString OPTIONAL,
- - Расширяющее дополнение к третьей версии
...
}
user UserName :: = {
personalName "Jonas Maruba",
intenetEmailAddress "jonas@meteor.ngo.com"
}
C.2.11.4. Тип "множество-из" используется для моделирования совокупности переменных, тип которых один и тот же, а порядок - не существенен.
Пример
Keywords:: = SET OF VisibleString - - в произвольном порядке
someASN1Keywords Keywords :: = {"INTEGER", "ROOLEAN", "REAL"}
До введения конструкции AUTOMATIC TAGS спецификации АСН.1 часто содержали теги. Ниже описывается способ, с которым обычно применялось тегирование. С введением конструкции AUTOMATIC TAGS в новых спецификациях АСН.1 нет необходимости использовать обозначения тегов, хотя при модификациях старой нотации следует позаботиться о тегах.
C.2.12.1. Теги универсального класса используются только в настоящем стандарте. Например нотация [UNIVERSAL 30] предназначена исключительно для обеспечения точности в определении международно стандартизованных полезных типов. Иначе она не должна использоваться.
C.2.12.2. Часто встречающийся стиль использования тегов - присвоение тега прикладного класса ровно один раз во всей спецификации и использование его для идентификации типа, который широко используется во всей спецификации. Тег прикладного класса также часто используется в качестве тега типа в самом внешнем выборе CHOICE приложения, обеспечивая идентификацию отдельных сообщений через тег прикладного класса. Пример использования тега в последнем случае:
FileName :: = [APPLICATION 8] SEQUENCE {
directoryName VisibleString,
directoryRelativeFileName VisibleString }
C.2.12.3. Контекстно зависящее тегирование часто применяется алгоритмическим образом ко всем компонентам множества SET, последовательности SEQUENCE или выбора CHOICE. Однако с помощью возможности AUTOMATIC TAGS это делается намного проще.
Пример
CustomerRecord :: = SET {
name [0] VisibleString,
maillingAddress [1] VisibleString,
accountNumber [2] INTEGER,
balanceDue [3] INTEGER }
CustomerAttribute :: = CHOICE {
name [0] VisibleString,
maillingAddress [1] VisibleString,
accountNumber [2] INTEGER,
balanceDue [3] INTEGER }
C.2.12.4. Тегирование пользовательского класса обычно не используется в спецификациях стандартов (хотя это и не запрещается). Приложения, созданные производителями, обычно будут использовать теги прикладного и контекстно зависящего классов. Однако в редких случаях спецификация конкретного производителя будет расширять спецификацию стандарта, и в этих случаях использование тегов пользовательского класса может дать некоторые преимущества в части защиты спецификации производителя от изменений спецификации стандарта.
Пример
AcmeBadgeNumber :: = [PRIVATE 2] INTEGER
badgeNumber AcmeBadgeNumber :: = 2345
C.2.12.5. Текстуальное использование IMPLICIT с каждым тегом можно найти только в старых спецификациях. Когда используется явное тегирование, правила BER создают менее компактное представление, чем при неявном тегировании. Правила PER создают одинаково компактное тегирование в обоих случаях. При использовании правил BER и явного тегирования в закодированных данных лучше видны нижележащие типы (INTEGER, REAL, BOOLEAN и прочие). В примерах настоящего руководства, когда возможно, используется неявное тегирование. Это может, в зависимости от правил кодирования, привести к компактному представлению, которое весьма желательно в некоторых приложениях. В других приложениях компактность может быть менее важна, чем, например, возможность осуществлять строгую проверку типов. В таком случае может использоваться явное тегирование.
Пример
CustomerRecord:: = SET {
name [0] IMPLICIT VisibleString,
maillingAddress [1] IMPLICIT VisibleString,
accountNumber [2] IMPLICIT INTEGER,
balanceDue [3] IMPLICIT INTEGER }
CustomerAttribute :: = CHOICE {
name [0] IMPLICIT VisibleString,
maillingAddress [1] IMPLICIT VisibleString,
accountNumber [2] IMPLICIT INTEGER,
balanceDue [3] IMPLICIT INTEGER }
C.2.12.6. Руководство по использованию тегов в новых спецификациях АСН.1, ссылающихся на настоящий стандарт, очень простое: НЕ ИСПОЛЬЗУЙТЕ ТЕГИ. Вставьте в заголовок модуля AUTOMATIC TAGS - и забудьте о тегах. Если в последующей версии вам необходимо добавить новые компоненты к множеству SET, последовательности SEQUENCE или выбору CHOICE, добавьте их в конце.
C.2.13. Выбор
C.2.13.1. Выборочный тип CHOICE используется для моделирования переменных, выбираемых из совокупности переменных, число которых известно и невелико.
Пример
FileIdentifier :: = CHOICE { - - идентификатор файла
relativeName VisibleString,
- - имя файла (например, "MarchProgressReport")
absoluteName VisibleString,
- - имя файла и содержащего его каталога
- - (например, "<Williams> MarchProgressReport")
serialNumber INTEGER
- - системный идентификатор файла - - }
file FileIdentifier :: = serialNumber: 106448503
C.2.13.2. Расширяемый выборочный тип CHOICE используется для моделирования переменных, выбираемых из совокупности переменных, разметка которой, вероятно, будет меняться от одной версии протокола к другой.
Пример
FileIdentifier :: = CHOICE { - - Первая версия FileIdentifier
relativeName VisibleString,
absoluteName VisibleString,
..., ...
}
fileId1 FileIdentifier :: = relativeName : "MarchProgressReport.doc"
в предвидении:
FileIdentifier :: = CHOICE { - - Вторая версия FileIdentifier
relativeName VisibleString,
absoluteName VisibleString,
...,
serialNumber INTEGER, - - Расширяющее дополнение
- - к второй версии
...
}
fileId1 FileIdentifier :: = relativeName : "MarchProgressReport.doc"
fileId2 FileIdentifier :: = serialNumber : 214
и позже:
FileIdentifier:: = CHOICE {- - Третья версия FileIdentifier
relativeName VisibleString,
absoluteName VisibleString,
...,
serialNumber INTEGER, - - Расширяющее дополнение,
- - к второй версии
[[ - - Расширяющее дополнение к третьей версии
vendorSpecific VendorExt,
unidentified NULL
]],
...
}
fileId1 FileIdentifier :: = relativeName : "MarchProgressReport.doc"
fileId2 FileIdentifier :: = serialNumber : 214
fileId3 FileIdentifier :: = unidentified : NULL
C.2.13.3. Расширяемый выборочный тип CHOICE из единственного типа используется, когда рассматривается возможность, что в будущем будут допустимы несколько типов.
Пример
Greeting :: = CHOISE { - - Первая версия Greeting
postCard VisibleString
...,
...
}
в предвидении:
Greeting :: = CHOISE { - - Вторая версия Greeting
postCard VisibleString,
...,
[[ - - Расширяющее дополнение к второй версии
audio Audio,
video Video
...
}
C.2.13.4. Когда одно выборочное значение вложено в другое выборочное значение, требуется несколько двоеточий.
Пример
Greeting :: = [APPLICATION 12] CHOISE {
postCard VisibleString,
recording Voice }
Voice :: = CHOICE {
english OCTET STRING,
swahili OCTET STRING }
myGreeting Greeting :: = recording : english : '019838547EO'H
C.2.14. Селективный тип
C.2.14.1. Селективный тип используется для моделирования переменной, тип которой есть тип некоторой конкретной альтернативы в определенном ранее выборе CHOICE.
C.2.14.2. Рассмотрим определение:
FileAttribute :: = CHOICE { - - атрибуты файла
date-last-used INTEGER, - - дата последнего использования
file-name VisibleString } - - имя файла
Тогда возможно следующее определение
AttributeList :: = SEQUENCE { - - список атрибутов
first-attribute date-last-used < FileAttribute,
second-attribute file-name < FileAttribute }
с возможной нотацией значения
listOfAttributes AttributeList :: = {
first-attribute 27,
second-attribute "PROGRAM" }
C.2.15. Тип "поле класса объектов"
C.2.15.1. Тип "поле класса объектов" используется для идентификации типа, определенного с помощью класса информационных объектов (см. ГОСТ Р ИСО/МЭК 8824-2). Например поля класса информационных объектов ATTRIBUTE могут быть использованы в определении типа Attribute.
Пример
ATTRIBUTE :: = CLASS
{
&AttributeType,
&attributeId OBJECT IDENTIFIER UNIQUE
}
Attribute :: = SEQUENCE {
attributeID ATTRIBUTE.&attributeId, - - обычно ограничен
attributeValue ATTRIBUTE.&attributeType - - обычно ограничено
}
Как ATTRIBUTE.&attributeId, так и ATTRIBUTE.&AttributeType являются типами полей класса объектов, определенными указанием класса информационных объектов ATTRIBUTE. Тип ATTRIBUTE.&attributeId фиксированный потому, что он явно определен в ATTRIBUTE как OBJECT IDENTIFIER. Однако тип ATTRIBUTE.&attributeType может передавать значения любого типа, определенного с использованием АСН.1, так как его тип не зафиксирован в определении ATTRIBUTE. Нотации, которые представляют данное свойство (передавать значение любого типа), называются "нотациями открытого типа", следовательно ATTRIBUTE.&AttributeType является открытым типом.
C.2.16. Встроенное-здп
C.2.16.1. Тип "встроенное-здп" используется для моделирования переменных, тип которых не задан или задан где-либо в другом месте, без ограничения на нотацию, используемую для спецификации типа.
Пример
FileContents :: = EMBEDDED PDV - - содержимое файла
DocumentList :: = SEQUENCE OF EMBEDDED PDV - - список документов
C.2.17. Внешний тип
Внешний тип похож на встроенное-здп, но имеет меньше идентификационных опций. В новых спецификациях предпочтительнее использовать встроенное-здп из-за его большей гибкости и того обстоятельства, что некоторые правила кодирования представляют его значения более эффективно.
C.2.18.1. Экземпляр-из используется для спецификации типа, содержащего поле идентификатора объекта и открытый тип, значение которого есть тип, определенный идентификатором объекта. Тип "экземпляр-из" ограничен тем, что может переносить значение из класса TYPE-IDENTIFIER (см. ГОСТ Р ИСО/МЭК 8824-2, приложения A и C).
Пример
ACCESS-CONTROL-CLASS :: = TYPE-IDENTIFIER
Get-Invoke :: = SEQUENCE {
objectClass objectClass,
objectInstance ObjectInstance,
accessControl INSTANCE OF ACCESS-CONTROL-CLASS,
- - обычно ограничен
attributeID ATTRIBUTE.&attributeId
}
Конструкция GET-Invoke эквивалентна следующей:
Get-Invoke :: = SEQUENCE {
objectClass objectClass,
objectInstance ObjectInstance,
accessControl [UNIVERSAL 8] IMPLICIT SEQUENCE {
type-id ACCESS-CONTROL-CLASS.&id, - - обычно ограничен
value [0] ACCESS-CONTROL-CLASS.&Type
- - обычно ограничен
},
attributeID ATTRIBUTE.&attributeId
}
Действительное предназначение типа "экземпляр-из" не видно до тех пор, пока он не ограничивается с использованием множества информационных объектов, но такие примеры выходят за рамки настоящего стандарта. Определение множества информационных объектов см. в ИСО/МЭК 8824-3, а в приложении А к нему - использование множества информационных объектов для ограничения типа "экземпляр-из". Кодирование INSTANCE OF ACCESS-CONTROL-CLASS то же самое, что и для значения EXTERNAL, которое содержит только идентификатор объекта и значение данных.
C.3.1. Использование услуг уровня представления (ГОСТ 34.971) требует спецификации значений, называемых значениями данных (уровня) представления, и объединений этих значений данных представления в множества, называемые абстрактными синтаксисами. Каждому из этих множеств дано имя абстрактного синтаксиса типа идентификатор объекта АСН.1.
C.3.2. АСН.1 может использоваться как общий инструмент для спецификации значений данных представления и их объединения в поименованные абстрактные синтаксисы.
C.3.3. В простейшем случае такого использования имеется единственный тип АСН.1, такой, что каждое значение данных представления в поименованном абстрактном синтаксисе является значением этого типа АСН.1. Этот тип обычно является выборочным типом, а каждое значение данных представления будет альтернативой из этого выборочного типа. В данном случае рекомендуется, чтобы используемая нотация модуля АСН.1 содержала этот выборочный тип в качестве первого определяемого типа с последующими определениями (не универсальных) типов, которые прямо или косвенно указываются в этом выборочном типе.
Примечание. Сказанное не подразумевает исключение ссылок на типы, определенные в других модулях.
C.3.4. Рекомендуется, чтобы присваивание идентификатора и описателя объекта абстрактному синтаксису осуществлялось с использованием полезного класса информационных объектов ABSTRACT-SYNTAX, определенного в ГОСТ Р ИСО/МЭК 8824-2. Также рекомендуется, чтобы все использования ABSTRACT-SYNTAX были сгруппированы в одном "корневом" модуле, идентифицирующем все абстрактные синтаксисы, используемые в прикладном стандарте.
C.3.5. Ниже приводится пример текста, который может встретиться в прикладном стандарте.
Пример
ISOxxxx-yyyy {iso standard xxxx ans1-modules (...) yyyy-pdu (...)}
DEFINITIONS :: = BEGIN
EXPORTS YYYY - PDU;
YYYY - PDU :: = CHOICE {
connect-pdu......,
data-pdu CHOICE {
......,
......
},
......
}
......
END
ISOxxxx-yyyy-Abstract-Syntax-Module {iso standard xxxx ans1-modules
(...)} DEFINITIONS :: = BEGIN
IMPORTS YYYY-PDU FROM ISOxxxx-yyyy {iso standard xxxx ans1-modules
(...) yyyy-pdu (...)};
- - В настоящем стандарте определен следующий абстрактный синтаксис:
YYYY-Abstract-Syntax ABSTRACT-SYNTAX :: =
{YYYY-PDU IDENTIFIED BY yyyy-abstract-syntax-object-id}
yyyy-abstract-syntax-object-id OBJECT IDENTIFIER :: = {
iso standard yyyy (xxxx) abstract-syntax (...)}
- - Соответствующим описателем объекта является
yyyy-abstract-syntax-descriptor ObjectDescriptor :: = ".........."
- - Значения идентификатора и описателя объекта АСН.1:
- - идентификатор объекта правила кодирования,
- - описатель объекта правила кодирования,
- - присвоенные правилам кодирования в ИСО/МЭК 8825-1 и ИСО/МЭК 8825-2
могут использоваться как
- - идентификатор синтаксиса передачи вместе с настоящим абстрактным
синтаксисом,
- - ISOxxxx-yyyy-Abstract-Syntax
END
C.3.6. Для того чтобы гарантировать взаимодействие, стандарт может дополнительно потребовать обязательной поддержки синтаксиса передачи, полученного применением правил кодирования, указанных в модуле абстрактного синтаксиса.
C.4.1. Подтипы используются для ограничения значений существующего типа, допустимых в конкретной ситуации.
Примеры
AtomicNumber :: = INTEGER (1..104) - - атомное число
TouchToneString :: = IA5String - - строка набора номера
(FROM ("0123456789" | "Н" | "#')) (SIZE (1.. 63))
ParameterList :: = SET SIZE (1.. 63) OF Parameter - - список параметров
SmallPrime :: = INTEGER (2 | 3 | 5 | 7 | 11 | 13 | 17 | 19 | 23 | 29)
- - малое простое число
C.4.2. Расширяемое ограничение подтипа используется для моделирования типа INTEGER, множество допустимых значений которого мало и четко определено, но может быть расширено.
Пример
SmallPrime :: = INTEGER (2 | 3,...) - - Первая версия SmallPrime
в предвидении:
SmallPrime :: = INTEGER (2 | 3,..., 5 | 7 | 11) - - Вторая версия
SmallPrime
и позже:
SmallPrime:: = INTEGER (2 | 3,..., 5 | 7 | 11 | 13 | 17 | 19)
- - Третья версия SmallPrime
Примечание. Для некоторых типов одни правила кодирования (например PER) обеспечивают высокооптимизированное кодирование значений для ограничения подтипа корня расширения (т.е. значений, стоящих до "...") и менее оптимизированное кодирование значений для ограничения подтипа расширяющих дополнений (т.е. значений, стоящих после "..."), тогда как при других правилах кодирования (например BER) ограничения подтипов не влияют на кодирование.
C.4.3. Когда два или более связанных типа имеют существенную общность, следует рассмотреть возможность явного определения этой общности как порождающего типа и введения подтипов для отдельных типов. Такой подход делает очевидными взаимосвязь и общность и продолжает их поддерживать для типов, имеющих отношение к делу. Тем самым обеспечивается возможность использования при реализации общего подхода к обработке значений этих типов.
Пример
Envelope :: = SET {
typeA TypeA,
typeB TypeB OPTIONAL,
typeC TypeC OPTIONAL }
- - общий порождающий тип
ABEnvelope :: = Envelope (WITH COMPONENTS
{...,
typeB PRESENT, typeC ABSENT })
- - typeB всегда должен присутствовать, typeC - отсутствовать
ACEnvelope :: = Envelope (WITH COMPONENTS
{...,
typeB ABSENT, typeC PRESENT })
- - typeC всегда должен присутствовать, typeB - отсутствовать
Два последних определения альтернативно могут быть записаны как:
ABEnvelope :: = Envelope (WITH COMPONENTS {typeA, type B})
ACEnvelope :: = Envelope (WITH COMPONENTS {typeA, type C})
Выбор между этими альтернативами мог бы быть сделан на основе таких факторов, как количество компонентов в порождающем типе, количество среди них факультативных, степень различия отдельных типов и, вероятно, стратегии развития.
C.4.4. Подтипы используются для частично определенных значений, например для протокольных блоков данных (ПБД), которые должны быть протестированы в тесте соответствия, когда тест направлен только на некоторые из компонентов ПБД.
Пример
Пусть определен ПБД
PDU :: = SET
{alpha INTEGER,
beta IA5String OPTIONAL,
gamma SEQUENCE OF Parameter,
delta BOOLEAN }
Тогда при составлении теста, требующего, чтобы булевское значение было ложным, а целое - отрицательным, записывается:
TestPDU :: = PDU (WITH COMPONENTS
{...,
delta (FALSE),
alpha (MIN..<0)})
Далее, если строка IA5String (beta) должна присутствовать и быть длиной 5 или 12 символов, то записывается:
FurtherTestPDU :: = TestPDU (WITH COMPONENTS {..., beta (SIZE (5 | 12)) PRESENT})
C.4.5. Если тип данных общего назначения был определен как SEQUENCE OF, то подтипы используются для определения ограниченных подтипов общего типа.
Пример
Text-block :: = SEQUENCE OF VisibleString
Address :: = Text-block (SIZE (1.. 6)) (WITH COMPONENT (SIZE (1.. 32)))
C.4.6. Если тип данных общего назначения был определен как CHOICE, то подтипы используются для определения ограниченных подтипов общего типа.
Пример
Z :: = CHOICE {
a A,
b B,
c C,
d D,
e E
}
V :: = Z (WITH COMPONENTS {..., a ABSENT, b ABSENT})
- - 'a' и 'b' должны отсутствовать;
- - 'c', 'd' или 'e' могут присутствовать в значении
W :: = Z (WITH COMPONENTS {..., a PRESENT})
- - может присутствовать только 'a' (см. 48.8.9.2)
X :: = Z (WITH COMPONENTS { a PRESENT})
- - может присутствовать только 'a' (см. 48.8.9.2)
Y :: = Z (WITH COMPONENTS {a ABSENT, b, c})
- - 'a', 'd' и 'e' должны отсутствовать;
- - 'c' или 'b' могут присутствовать в значении
Примечание. W и X семантически идентичны.
C.4.7. Подтипы используются для образования новых подтипов из существующих.
Пример
Months:: = ENUMERATED {
january (1),
february (2),
march (3),
april (4),
may (5),
june (6),
july (7),
august (8),
september (9),
october (10),
november (11),
december (12) }
First-quarter :: = Months (
january |
february |
march)
Second-quarter :: = Months (
april |
may |
june)
Third-quarter :: = Months (
july |
august |
september)
Fourth-quarter :: = Months (
october |
november |
december)
First-half :: = Months (First-quarter | Second-quarter)
Second-half :: = Months (Third-quarter | Fourth-quarter)
(справочное)
D.1.1. Имеются следующие четыре группы символьных строк, поддерживаемых в АСН.1:
а) типы символьных строк, основанные на Международном регистре ИСО наборов кодированных символов, которые должны использоваться с Escape-последовательностями (то есть на структуре ИСО 646), и на связанном с ним Международном регистре кодовых символьных наборов, которые обеспечиваются типами VisibleString, IA5String, TeletexString, VideotexString, GraphicString и GeneralString;
б) типы символьных строк, основанные на ИСО/МЭК 10646-1, которые обеспечиваются типами UniversalString, UTF8String и BMPString с подмножествами, определенными в ИСО/МЭК 10646-1, или использованием поименованных символов;
Примечания
1. Использование типа UniversalString без ограничений приводит к нарушению требований соответствия для информационного обмена, специфицированных в ИСО/МЭК 10646-1, так как при этом заданы не принимаемые подмножества.
2. Несмотря на сказанное выше, использование этого типа с простым ограничением подтипа, которое использует параметр абстрактного синтаксиса (для ограничения определенным подтипом UniversalString), может обеспечить мощный и гибкий механизм обработки символов, доверяя профилям определение значения параметра для удовлетворения конкретных потребностей сообщества пользователей. Однако в общем случае в стандартах предпочтительнее использовать тип CHARACTER STRING (см. ниже).
в) типы символьных строк, обеспечивающие простые небольшие совокупности символов, определенные в настоящем стандарте и предназначенные для специализированного использования; к ним относятся типы NumericString и Printable String;
г) тип CHARACTER STRING с согласованным (или объявленным) символьным набором, который будет использоваться; это позволяет реализации использовать любую совокупность символов и кодирований, которым присвоены OBJECT IDENTIFIER, включая совокупности из Международного регистра ИСО наборов кодированных символов, которые должны использоваться с Escape-последовательностями, ИСО/МЭК 7350, ИСО/МЭК 10646-1 и пользовательские совокупности символов и кодирования (профили могут накладывать требования или ограничения на символьные наборы - символьные абстрактные синтаксисы, которые могут использоваться).
D.2.1. Типы UniversalString и UTF8String переносят любые символы из ИСО/МЭК 10646-1. Наборы символов в ИСО/МЭК 10646-1 в общем случае слишком велики для разумных требований соответствия и обычно должны быть выделены их поднаборы в виде комбинаций стандартных совокупностей символов из приложения А ИСО/МЭК 10646-1.
D.2.2. Тип BMPString переносит любые символы из основной многоязычной плоскости ИСО/МЭК 10646-1 (первые 62K - 2 символов). Основная многоязычная плоскость обычно разбивается на поднаборы в виде комбинаций стандартных совокупностей символов из приложения А ИСО/МЭК 10646-1.
D.2.3. Для совокупностей, определенных в ИСО/МЭК 10646-1, приложение A, имеются ссылки на тип, приведенные во встроенном модуле АСН.1 "ASN1-CHARACTER-MODULE" (см. раздел 37). Метод "ограничения подтипа" позволяет определять новые подтипы UniversalString, которые являются комбинациями существующих подтипов.
D.2.4. Примерами ссылок на тип, определенных в ASN1-CHARACTER-MODULE, и соответствующих им имен совокупностей в ИСО/МЭК 10646-1 являются:
BasicLatin BASIC LATIN
Latin-1Supplement LATIN-1 SUPPLEMENT
LatinExtended-a LATIN EXTENDED-A
LatinExtended-b LATIN EXTENDED-B
IpaExtensions IPA EXTENSIONS
SpacingModifierLetters SPACING MODIFIER LETTERS
CombiningDiacriticalMarks COMBINING DIACRITICAL MARKS
D.2.5. В ИСО/МЭК 10646-1 определены три "уровня реализации" и требуется, чтобы все пользователи ИСО/МЭК 10646-1 устанавливали уровень реализации.
Уровень реализации относится к степени, в которой поддерживаются комбинированные символы и, следовательно в терминах АСН.1, определяется подмножество UniversalString и BMPString, ограничивающее типы символьных строк.
Для уровня реализации 1 комбинированные символы недопустимы, и обычно имеется взаимно однозначное соответствие между абстрактными символами (ссылками на ячейки) в символьной строке АСН.1 и печатными символами в физическом представлении строки.
Для уровня реализации 2 допускается использование некоторых комбинированных символов (перечисленных в ИСО/МЭК 10646-1, приложение B), но использование других таких символов запрещено.
Для уровня реализации 3 нет ограничений на использование комбинированных символов.
D.2.6. Типы BMPString и UniversalString могут быть ограничены с помощью нотации подтипа так, чтобы исключить все управляющие функции:
VanillaBMPString :: = BMPString (FROM (ALL EXCEPT
({0, 0, 0, 0} .. {0, 0, 0, 31} | {0, 0, 0, 128} ..
{0, 0, 0, 159})))
или, эквивалентно,
C0 :: = BMPString (FROM ({0, 0, 0, 0}.. {0, 0, 0, 31})) - - Функции C0
C1 :: = BMPString (FROM ({0, 0, 0, 128}.. {0, 0, 0, 159})) - - Функции C1
VanillaBMPString :: = BMPString (FROM (ALL EXCEPT (C0 | C1)))
Использование UniversalString, BMPString или UTF8String (или их подтипов) в определении типа АСН.1 требует обращения к требованиям соответствия ИСО/МЭК 10646-1.
Согласно этим требованиям соответствия разработчики стандарта (скажем, X), использующие такие типы АСН.1, должны обеспечивать (в заявке о соответствии реализации протоколу) утверждение о принимаемом подмножестве ИСО/МЭК 10646-1 для реализаций их стандарта X или об уровне поддержки комбинированных символов этими реализациями.
Использование подтипа UniversalString, UTF8String или BMPString в спецификации требует, чтобы реализации поддерживали все символы ИСО/МЭК 10646-1, включенные в этот подтип АСН.1, и, следовательно, чтобы (по крайней мере) эти символы присутствовали в принимаемом подмножестве для реализации. Также требуется, чтобы установленный уровень поддерживался всеми такими подтипами АСН.1.
Примечание. Спецификация АСН.1 (при отсутствии параметров абстрактного синтаксиса и спецификации исключений) определяет как максимальный набор символов, которые могут быть переданы, так и минимальный набор символов, которые должны обрабатываться получателем. Принимаемый набор ИСО/МЭК 10646-1 требует, чтобы символы не из этого набора не передавались, а все символы этого набора поддерживались получателем. Следовательно необходимо, чтобы принимаемый набор был бы в точности набором всех символов, допускаемых спецификацией АСН.1. Случай, когда имеется параметр абстрактного синтаксиса, рассматривается ниже.
Пользователи АСН.1 должны четко устанавливать набор символов ИСО/МЭК 10646-1, который образует принимаемый поднабор реализации (и требуемый уровень реализации) для того, чтобы выполнялись требования их стандарта.
Это можно удобно сделать путем определения подтипа UniversalString, UTF8String или BMPString, который содержит все необходимые для стандарта символы, и ограничения его "уровнем 1" или "уровнем 2". Подходящим именем для этого типа может быть "ISO-10646-String".
Пример
ISO-10646-String :: = BMPString
(FROM (Level2 INTERSECTION (BasicLatin UNION HebrewExtended UNION
Hiragana)))
- - Это тип, который определяет минимальный набор символов
в принимаемом поднаборе для
- - реализации настоящего стандарта.
- - Требуемый уровень реализации - не ниже 2.
Тогда ЗСРП будет содержать простое утверждение, что принимаемый поднабор ИСО/МЭК 10646-1 есть ограниченный поднабор (и уровень), определенный типом "ISO-10646-String", а "ISO-10646-String" (возможно, его подтипы) будет использоваться в стандарте всюду, где требуется включить строки ИСО/МЭК 10646-1.
Пример ЗСРП
Принимаемый поднабор ИСО/МЭК 10646-1 есть ограниченный поднабор, состоящий из всех символов в типе АСН.1 "ISO-10646-String", определенном в модуле <имя модуля>, с уровнем реализации 2.
Пример использования в протоколе:
Message :: = SEQUENCE {
first-field ISO-10646-String - - допустимы все символы из принимаемого
поднабора
second-field ISO-10646-String (FROM (latinSmallLetterA ..
latinSmallLetterZ)),
- - допустимы только строчные латинские
буквы
third-field ISO-10646-String (FROM (digitZero .. digitNine))
- - допустимы только цифры
}
Стандарт ИСО/МЭК 10646-1 требует, чтобы принимаемый поднабор и уровень реализации были определены явно. Когда пользователь АСН.1 не хочет ограничивать диапазон символов ИСО/МЭК 10646-1 в некоторой части разрабатываемого стандарта, то это можно сделать, определяя (например) "ISO-10646-String" как подтип UniversalString, UTF8String или BMPString с ограничением подтипа, состоящим из (или содержащим) "ImplementorsSubset", который остается параметром абстрактного синтаксиса.
Пользователи АСН.1 должны учитывать, что в этом случае соответствующий отправитель может передать соответствующему получателю символы, которые не могут быть обработаны получателем, потому что они выпадают из (зависящего от реализации) принимаемого поднабора или уровня получателя, и рекомендуется, чтобы в этом случае в определение "ISO-10646-String" включалась спецификация обработки исключений.
Пример
ISO-10646-String {UniversalString: ImplementorsSubset,
ImpementationLevel}:: =
UniversalString (FROM ((ImplementorsSubset
UNION BasicLatin)
INTERSECTION ImplementationLevel) characterSetPrblem)
- - Принимаемый поднабор ИСО/МЭК 10646-1 должен содержать "BasicLatin", но может содержать
- - любые дополнительные символы, определенные в "ImplementorsSubset", который является
- - параметром абстрактного синтаксиса. "ImpementationLevel" является параметром абстрактного
- - синтаксиса, определяющим уровень реализации. Соответствующий получатель должен
- - быть готов получить символы вне этого принимаемого поднабора и уровня реализации.
- - Обработка исключения в этом случае определена в разделе <номер раздела> для вызова
- - "characterSetPrblem". Она может никогда не вызываться соответствующим получателем,
- - если символы, фактически используемые в сеансе
- - взаимодействия, ограничены совокупностью "BasicLatin".
My-Level2-String :: = ISO-10646-String {{HebrewExtended UNION
Hiragana}, Level2}
D.6.1. Тип CHARACTER STRING предоставляет полную гибкость в выборе символьного набора и метода кодирования. Когда единственное соединение обеспечивает сквозную передачу данных (без прикладной ретрансляции), тогда должно использоваться согласование символьных наборов, а кодирование может быть выполнено как часть определения контекстов представления для символьных абстрактных синтаксисов.
D.6.2. Важно понимать, что символьный абстрактный синтаксис является обычным абстрактным синтаксисом с некоторыми ограничениями на возможные значения (они все являются символьными строками и всеми символьными строками, образованными из некоторой совокупности символов). Таким образом, регистрация таких синтаксисов и согласование контекста представления осуществляется обычным путем.
D.6.3. Кодирование типа CHARACTER STRING также допускает объявление используемых абстрактного синтаксиса и синтаксиса передачи без согласования в том окружении, в котором это применимо.
Примечания
1. Проектировщики приложений могут запретить использование согласования представления, сделать его обязательным или оставить на усмотрение отправителя.
2. Когда используется объявление, а не согласование, проектировщик приложения должен рассмотреть, как отправитель может определить, что символьный абстрактный синтаксис (и синтаксис передачи) может быть приемлемым для получателя (например, используя услуги справочника или в результате профилирования), а также рассмотреть действия получателя, если получено значение CHARACTER STRING из символьного абстрактного синтаксиса, который не поддерживается.
D.6.4. Если используется согласование, то проектировщик прикладного уровня может управлять таким согласованием, специфицируя, когда должны быть установлены такие контексты представления, и параметр пользовательских данных примитива P-ALTER-CONTEXT, или может просто принять, что некоторый профиль должен определить, какой символьный абстрактный синтаксис должен использоваться, устанавливая для него контекст представления в момент передачи примитива P-CONNECT.
D.6.5. Возможности управления контекстом услуг уровня представления позволяют инициатору (в P-CONNECT или в установленном соединении, используя P-ALTER-CONTEXT) предложить список новых или исключаемых из использования абстрактных синтаксисов (который может содержать символьные абстрактные синтаксисы), а получателю - выбрать из этого списка.
D.6.6. Инициатор может выразить свои предпочтения порядком абстрактных синтаксисов в списке или через параметр пользовательских данных, который предоставлен проектировщиком приложения для того, чтобы пояснить цель предлагаемого использования нового абстрактного синтаксиса. Например он может указывать, что все (символьные) абстрактные синтаксисы предлагаются для использования с одной единственной целью или что подразумевается выбор единственного (символьного) абстрактного синтаксиса для использования в различных целях.
D.6.7. Символьные абстрактные синтаксисы (и соответствующие символьные синтаксисы передачи) определяются в ряде стандартов (или рекомендаций МСЭ-Т), а дополнительные символьные абстрактные синтаксисы (и/или символьные синтаксисы передачи) могут быть определены любой организацией, выделяющей идентификаторы объектов.
D.6.8. В ИСО/МЭК 10646-1 имеется символьный абстрактный синтаксис, определенный (и ему присвоен идентификатор объекта) для всей совокупности символов, каждой определенной совокупности символов, поднаборов (BASIC LATIN, BASIC SYMBOLS и т.д.) и любой возможной комбинации определенных совокупностей символов. В ИСО/МЭК 10646-1 имеются также два символьных синтаксиса передачи, определенные для идентификации различных опций (в частности, 16- и 32-битовых).
(справочное)
ЗАМЕНЕННЫЕ ХАРАКТЕРИСТИКИ
Ряд характеристик, включенных в предшествующую редакцию настоящего стандарта (а именно в ГОСТ Р ИСО/МЭК 8824), были заменены и теперь не являются частью АСН.1. Однако они могут встретиться в некоторых существующих модулях АСН.1. В настоящем приложении описаны эти характеристики и то, как их возможности могут быть реализованы с использованием заменивших их характеристик.
Нотациями для NamedType и NamedValue первоначально были:
NamedType :: = identifier Type | Type | SelectionType
NamedValue :: = identifier Value | Value
но теперь они изменены на:
NamedType :: = identifier Type
NamedValue :: = identifier Value
так как прежние приводили к двусмысленной грамматике.
Идентификаторы могут быть добавлены к поименованным типам NamedType в старых спецификациях АСН.1 без влияния на кодирование типа (хотя изменения АСН.1 будут необходимы для всех использований соответствующих нотаций значений). Такие изменения могут быть даны либо в сообщении об ошибках, либо как часть новой версии модифицируемого стандарта.
Нотацией значения для выборочного типа первоначально была:
ChoiceValue :: = NamedValue
NamedValue :: = identifier Value | Value
но теперь она изменена на
ChoiceValue :: = identifier ":" Value
так как прежняя приводила к двусмысленной грамматике.
Произвольный тип был определен в ранних версиях настоящего стандарта.
Обычно произвольный тип использовался для того, чтобы оставить "дыру" в спецификации, которая должна быть заполнена некоторой другой спецификацией. Нотацией была "AnyType", которая допускалась в качестве альтернативы для "TYPE" и определялась как:
AnyType :: = ANY | ANY DEFINED BY identifier
Нотация значения для произвольного типа была
AnyValue :: = Type Value
хотя позднее она была изменена на
AnyValue :: = Type : Value
так как прежняя приводила к трудностям при машинной обработке АСН.1.
Настоятельно рекомендовалось использовать вторую альтернативу нотации. В этой альтернативе (единственной возможной, когда произвольный тип был одним из типов компонентов множества или последовательности) некоторый другой компонент множества или последовательности (с указанным идентификатором "identifier") должен был указывать, своим целочисленным значением или значением "идентификатор объекта" (или выбором из них), фактический тип, управляющий произвольным компонентом. Отображение таких значений в конкретные типы АСН.1 могло бы выглядеть как некоторая "таблица", образующая часть абстрактного синтаксиса. При отсутствии "DEFINED BY identifier" (первая альтернатива нотации) в нотации не было бы указания, как может быть определен тип поля. Это часто приводило к спецификациям, в которых "дыра" продолжала существовать даже на стадии, когда предполагалась реализация.
Теперь произвольный тип заменен возможностью спецификации классов информационных объектов и последующим указанием полей классов информационных объектов в определениях типов (см. ГОСТ Р ИСО/МЭК 8824-2). Так как поля могут быть определены таким образом, чтобы допускался произвольный тип АСН.1, то обеспечивается основная возможность - оставлять "дыры" в спецификации. Однако новая характеристика допускает спецификацию "табличного ограничения", в которой конкретное "множество информационных объектов" (соответствующего класса информационных объектов) явно указывается как ограничение типа. Тем самым обеспечивается то, что раньше обеспечивалось конструкцией "ANY DEFINED BY identifier".
Кроме того, предоставляется некоторое предопределенное использование новых возможностей (см. ГОСТ Р ИСО/МЭК 8824-2), которое соответствует различным, обычно встречающимся образцам использования произвольного типа. Например последовательность, содержащая идентификатор объекта и произвольный тип, ранее часто использовавшаяся для передачи произвольного значения вместе с идентификацией его типа, может быть описана как
INSTANCE OF MUMBLE
где MUMBLE определяется как класс информационных объектов (а не как тип АСН.1):
MUMBLE :: = TYPE-IDENTIFIER
Эта нотация приводит к тому, что конструкция "INSTANCE OF MUMBLE" должна быть заменена идентификатором объекта для объекта класса MUMBLE вместе с типом, указанным идентификатором объекта. Пример см. в C.2.18.
Конкретные пары идентификаторов объектов и типов определяются как информационные объекты класса MUMBLE, а если требуется, то могут быть определены их конкретные множества и использованы для ограничения конструкции INSTANCE OF таким образом, что могут встречаться только объекты этого множества.
Макровозможности часто использовались как полуформальный способ определения таблиц информационных объектов для управления ассоциированным использованием произвольного типа и заменены новыми возможностями.
Макровозможности позволяли пользователю АСН.1 расширять нотацию путем определения макросов.
Основным использованием макровозможностей было определение нотации для спецификации информационных объектов. Теперь такая возможность включена непосредственно в АСН.1 (см. ГОСТ Р ИСО/МЭК 8824-2) без необходимости совершенно общей (и, соответственно, опасной) определяемой пользователем нотации.
Кроме того, единственным другим использованием нотации является, видимо, определение выражений, которые должны применяться с некоторыми параметрами для того, чтобы быть полностью определенными типами АСН.1. Теперь это обеспечивается более общими возможностями параметризации (см. ИСО/МЭК 8824-4).
(обязательное)
Приложение должно использоваться главным образом разработчиками с целью гарантировать, что они идентично интерпретируют язык. Оно приведено, чтобы четко специфицировать, что допустимо в АСН.1, а что - нет, и позволить специфицировать точное значение, которое идентифицирует какое-либо имя ссылки на значение, и точное множество значений, которое идентифицирует какое-либо имя ссылки на множество типов или значений. Приложение не устанавливает определения допустимых преобразований нотаций АСН.1 для каких-либо целей, отличных от указанных выше.
A :: = INTEGER
B :: = [1] INTEGER
C :: = [2] INTEGER (0.. 6,...)
D :: = [2] INTEGER (0.. 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
F.1.2. Ясно, что ссылки на значения a, b, c, d, e, f могут быть использованы в нотациях значений, управляемых A, B, C, D, E, F соответственно. Например:
W :: = SEQUENCE {w1 A DEFAULT a}
x A :: = a
Y :: = A (1 .. a)
где все записи допустимы при определениях, данных в F.1.1. Однако если заменить A на B, C, D, E или F, то будут ли получившиеся предложения допустимыми? Аналогично, если ссылку на значение a заменить ссылкой b, c, d, e или f, то будут ли получившиеся предложения допустимыми?
F.1.3. Более сложный вопрос возник бы в случае замены ссылки на тип явным текстом правой части присваивания.
Например:
f INTEGER {red (0), white (1), blue (2), green (3), purple (4)} :: =
green
W :: = SEQUENCE{
w1 INTEGER {red (0), white (1), blue (2), green (3), purple (4)}
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)
Допустимо ли это в АСН.1?
F.1.4. Некоторые из приведенных выше примеров таковы, что даже если и являются допустимыми (а большинство из них допустимы - см. ниже), то пользователям не следовало бы писать аналогичные тексты, так как они мало понятны и вводят в заблуждение. Однако часто встречается использование ссылки на значение некоторого типа (не обязательно INTEGER), как на значение по умолчанию для этого типа с применением тегирования или образования подтипа в управляющем типе. Понятие "отображение значений" вводится для того, чтобы обеспечить ясный и точный смысл определения, какие из приведенных выше конструкций допустимы.
F.1.5. Рассмотрим определения
C :: = [2] INTEGER (0.. 6,...)
E :: = INTEGER (7.. 20)
F :: = INTEGER {red (0), white (1), blue (2), green (3), purple (4)}
В каждом случае создается новый тип. Для F можно четко идентифицировать соответствие 1 - 1 между значениями в этом типе и значениями в универсальном типе INTEGER. Для C и E можно четко идентифицировать соответствие 1 - 1 между значениями в этих типах и подмножествами значений в универсальном типе INTEGER. Это взаимоотношение называется отображением значений между значениями в двух типах. Более того, так как значения в C, E и F имеют отображения 1 - 1 в значения INTEGER, можно использовать эти отображения для обеспечения отображений между значениями самих C, E и F. Для C и F это показано на рисунке F.1.
![]() F.1.6. Пусть имеется ссылка на значение, такая как
c C :: = 5
на значение в C, которая должна в некотором контексте идентифицировать значение в F. Тогда, при условии, что существуют отображения значений между этим значением в C и (единственным) значением в F, можно определить C как допустимую ссылку на значение в F. Это показано на рисунке F.2, где ссылка на значение C используется для идентификации значения в F и может использоваться вместо непосредственной ссылки f1, которую в противном случае, нужно было бы определить:
f1 F :: = 5
![]() F.1.7. Следует учитывать, что в некоторых случаях в одном типе имеются значения (например 7 - 20 в A, см. F.1.1), которые имеют отображения в значения в другом типе (например, 7 - 20 в E, см. F.1.1), а другие значения (например равные или больше 21 в A, см. F.1.1) таких отображений не имеют. Ссылка на такое значение в A не даст допустимой ссылки на значение в E. (В данном примере весь тип E имеет отображение значений в подмножество A. В общем случае, в обоих типах могут быть подмножества значений, имеющих отображения, и подмножества значений без отображений).
F.1.8. В стандартах АСН.1 используется текст на естественном языке для спецификации допустимости в приведенных выше и аналогичных случаях. В F.6 даны точные требования для допустимости, к которым следует обращаться при затруднениях со сложными конструкциями.
Примечание. То обстоятельство, что определено отображение значений между двумя конструкциями "Type", позволяет использовать ссылки на значения, установленные с использованием одной конструкции "Type", для идентификации значений в другой конструкции "Type", которая достаточно похожа на первую. Это позволяет типизировать пустые и фактические параметры, используя текстуально разные конструкции "Type" без нарушения правил совместимости пустых и фактических параметров. Кроме того, это позволяет специфицировать поля классов информационных объектов, используя одну конструкцию "Type", а соответствующие значения в информационном объекте - используя другую конструкцию "Type", которая достаточно похожа на первую. (Эти примеры не являются исчерпывающими). Рекомендуется, чтобы преимущества, предоставляемые этой свободой, использовались в таких простых случаях, как "SEQUENCE OF INTEGER" или "CHOICE {int INTEGER, id OBJECT IDENTIFIER}", а не в более сложных конструкциях "Type".
F.2.1. Лежащей в основе моделью являются типы, такие как неперекрывающиеся контейнеры, в которых находятся значения, и конструкция АСН.1 "Type", каждое появление которой определяет новый, отличный от других, тип (см. рисунки F.1 и F.2). В настоящем приложении устанавливается, когда между такими типами существует отображение значений, позволяющее использовать ссылку на значение одного типа, когда нужна ссылка на значение некоторого другого.
Пример. Рассмотрим
X :: = INTEGER
Y :: = INTEGER
где X и Y - имена ссылок на два разных типа (указатели), но между этими типами существует отображение значений, так что любая ссылка на значение X может использоваться там, где управляет Y (например после DEFAULT).
F.2.2. На множестве всех возможных значений АСН.1 отображение значений относится к паре значений. Все множество отображений значений является математическим отношением. Это отношение обладает следующими свойствами: оно рефлексивно (каждое значение АСН.1 отображается само на себя), симметрично (если, по определению, существует отображение значения x1 в значение x2, то существует и отображение значения x2 в x1) и транзитивно (если существуют отображения значения x1 в x2 и x2 в x3, то существует и отображение значения x1 в x3).
F.2.3. Для любых двух данных типов X1 и X2, рассматриваемых как множества значений, множество отображений значений из X1 в X2 является отношением один к одному, т.е. для всех значений x1 из X1 и x2 из X2, если существует отображение значения x1 в x2, то:
а) нет отображения значения x1 в значение из X2, отличное от x2, и
б) нет отображения значения из X1 (отличного от x1) в значение x2.
F.2.4. Когда существует отображение значений между значениями x1 и x2, ссылка на любое из этих значений автоматически может использоваться для ссылки на другое значение, если это требуется некоторым управляющим типом.
Примечание. Определение отображений между значениями некоторых конструкций "Type" предназначено только для обеспечения гибкости при использовании нотации АСН.1. Существование таких отображений не имеет никакого отношения к тому, что эти два типа несут одну и ту же прикладную семантику, но рекомендуется, чтобы конструкции АСН.1, которые были бы недопустимы без отображения значений, использовались только в тех случаях, когда соответствующие типы действительно выражают одну и ту же прикладную семантику. Часто отображения значения будут существовать в больших спецификациях между типами, которые являются идентичными конструкциями АСН.1, но несут совершенно разную прикладную семантику, и существование таких отображений никогда не должно использоваться при определении допустимости всей спецификации.
F.3.1. Понятие "определения идентичных типов" используется для того, чтобы было возможно определить отображения значений между двумя экземплярами "Type", которые либо идентичны, либо достаточно похожи для использования в качестве взаимозаменяемых. Для определения точного смысла выражения "достаточно похожи" в настоящем разделе специфицирован ряд преобразований, которые применяются к каждому из экземпляров "Type" для приведения их к нормальной форме. Два экземпляра "Type" являются определениями идентичных типов только в том случае, когда их нормальные формы являются идентично упорядоченными списками одних и тех же элементов АСН.1 (см. раздел 11).
F.3.2. Каждый экземпляр "Type" в спецификации АСН.1 является упорядоченным списком элементов, определенных в разделе 11. Нормальная форма получается путем применения преобразований, определенных в F.3.2.1 - F.3.2.4 в указанном порядке.
F.3.2.1. Удаляются все комментарии (см. 11.6).
F.3.2.2. Следующие преобразования не являются рекурсивными и, следовательно, должны применяться только один раз в произвольном порядке.
а) Для каждого целочисленного типа: "NamedNumberList" (см. 18.1), если он есть, переупорядочивается так, чтобы "identifier" были расположены в алфавитном порядке.
б) Для каждого перечислимого типа: к каждому "EnumerationItem" (см. 19.1), который не есть "identifier" (без номера), добавляется номер, как установлено в 19.3; затем "RootEnumeration" переупорядочивается так, чтобы "identifier" были расположены в алфавитном порядке.
в) Для каждого типа "битовая строка": "NamedBitList" (см. 21.1), если он есть, переупорядочивается так, чтобы "identifier" были расположены в алфавитном порядке.
г) Для каждого значения идентификатора объекта: каждый "ObjIdComponent" преобразуется в соответствующую ему "NumberForm" согласно семантике раздела 31 (см. пример в 31.11).
д) Для типов "последовательность" (см. раздел 24) и "множество" (см. раздел 26): любое расширение вида "ExtensionAndException" или "ExtensionAdditions" вырезается и помещается в конец "ComponentTypeLists"; "OptionalExtensionMarker", если он есть, удаляется.
Когда "TagDefault" есть "IMPLICIT TAGS", то к каждому экземпляру "Tag" добавляется ключевое слово "IMPLICIT TAGS" (см. раздел 30), если только не выполнено одно из следующих условий:
- оно уже есть, или
- присутствует ключевое слово EXPLICIT, или
- тегируемый тип есть CHOICE, или
- это открытый тип.
Когда "TagDefault" есть "AUTOMATIC TAGS", то решение о применении автоматического тегирования принимается в соответствии с 24.2 (автоматическое тегирование будет осуществляться позже).
Примечание. 24.3 и 26.2 устанавливают, что присутствие элемента "Tag" в "ComponentType", который будет вставлен в результате замены "COMPONENTS OF Type", само по себе не предотвращает преобразования автоматического тегирования.
Когда "ExtensionDefault" есть "EXTENSIBILITY IMPLIED", то после "ComponentTypeLists" добавляется многоточие ("..."), если его не было.
е) Для выборочного типа (см. раздел 28): "RootAlternativeTypeList" переупорядочивается так, чтобы идентификаторы в "NamedType" были расположены в алфавитном порядке. Когда "TagDefault" есть "IMPLICIT TAGS", то к каждому экземпляру "Tag" добавляется ключевое слово "IMPLICIT TAGS" (см. раздел 30), если только не выполнено одно из следующих условий:
- оно уже есть, или
- присутствует ключевое слово EXPLICIT, или
- тегируемый тип есть CHOICE, или
- это открытый тип.
Когда "TagDefault" есть "AUTOMATIC TAGS", то решение о применении автоматического тегирования принимается в соответствии с 24.2 (автоматическое тегирование будет осуществляться позже). Когда "ExtensionDefault" есть "EXTENSIBILITY IMPLIED", то после "AlternativeTypeLists" добавляется многоточие, если его не было.
F.3.2.3. Следующие преобразования должны применяться рекурсивно в указанном порядке до достижения неизменного состояния.
а) Для каждого значения идентификатора объекта (см. 31.3): если определение значения начинается с "DefinedValue", то "DefinedValue" заменяется ее определением.
б) Для типов "последовательность" и "множество": все экземпляры "COMPONENTS OF Type" (см. раздел 24) преобразуются в соответствии с разделами 24 и 26.
в) Для выборочных типов, типов "последовательность" и "множество": если ранее было принято решение о применении автоматического тегирования [см. F.3.2.2, перечисления д) и е)], то оно осуществляется в соответствии с разделами 24, 26 и 28.
г) Для селективного типа: конструкция заменяется выбранной альтернативной в соответствии с разделом 29.
д) Все ссылки на типы заменяются их определениями по следующим правилам:
- если замещающий тип является ссылкой на тип, являющийся преобразованным, то ссылка на тип заменяется специальным элементом, которому не соответствует никакой другой кроме его самого;
- если замещающий тип является типом "последовательность-из" или "множество-из", то ограничения, следующие за замещаемым типом, если они есть, помещаются перед ключевым словом "OF";
- если замещаемый тип является параметризованным типом или множеством параметризованных значений (см. ИСО/МЭК 8824-4, 8.2), то каждый элемент "DummyReference" заменяется соответствующим "ActualParameter".
е) Все ссылки на значения заменяются их определениями; если замещаемое значение является параметризованным (см. ИСО/МЭК 8824-4, 8.2), то каждый элемент "DummyReference" заменяется соответствующим "ActualParameter".
Примечание. До замены любой ссылки на значение должны быть применены процедуры настоящего приложения, для того чтобы гарантировать, что ссылка на значение идентифицирует, непосредственно или через отображения значений, значение ее управляющего типа.
F.3.2.4. Для типа "множество": "RootComponentTypeList" переупорядочивается так, чтобы "ComponentType" были расположены в алфавитном порядке (от "a" до "z").
Примечание. В 11.9 (bstring), 11.10 (hstring) и 11.11 (cstring) установлено, что новые строки и пропуски в таких элементах значения не имеют. Если два экземпляра таких элементов содержат различающиеся использования новых строк и пропусков, то для целей F.3.3 они трактуются как идентичные.
F.3.3. Если два экземпляра "Type", преобразованные к нормальной форме, являются идентичными списками элементов АСН.1 (см. раздел 11), то они называются определениями идентичных типов за следующим исключением: если "objectclassreference" (см. ГОСТ Р ИСО/МЭК 8824-2, 7.1) встречается в какой-либо нормальной форме "Type", то эти два экземпляра не являются определениями идентичных типов и между ними не существует отображения значений (см. F.4 ниже).
Примечание. Это исключение введено для предотвращения необходимости введения правил преобразования к нормальной форме для элементов синтаксиса, относящихся к нотации информационных объектов, их классов и множеств. Аналогично не определена нормализация для нотации всех значений и нотации арифметической установки. После доказательства требований для таких спецификаций они могут быть включены в последующие версии стандарта. Понятия определений идентичных типов и отображений значений введены для обеспечения того, что простые конструкции АСН.1 могут быть использованы либо через имена ссылок, либо копированием текста. Нет необходимости обеспечивать эту возможность для более сложных экземпляров "Type", содержащих классы информационных объектов и пр.
F.4.1. Если два экземпляра "Type" являются определениями идентичных типов по правилам F.3, то существуют отображения между всеми значениями одного типа и соответствующими значениями другого.
F.4.2. Для типа X1, созданного тегированием из некоторого типа X2 (см. раздел 30), отображения значений существуют по определению между всеми членами X1 и соответствующими членами X2.
Примечание. Хотя отображения значений по определению существуют между значениями X1 и X2 из F.4.2 и между значениями X3 и X4 из F.4.3, если такие типы встроены в идентичные в других отношениях, но разные определения типов (таких как определения типов SEQUENCE или CHOICE), получающиеся определения типов (SEQUENCE или CHOICE) не будут определениями идентичных типов и между ними не существуют отображения значений.
F.4.3. Для типа X3, созданного из некоторого управляющего типа X4 выбором значений, конструкцией множества элементов или образованием подтипа, отображения значений существуют по определению между членами нового типа и теми членами управляющего типа, которые были выбраны конструкцией множества элементов или подтипа. Присутствие или отсутствие маркера расширения не влияет на это правило.
F.4.4. В F.5 определены дополнительные отображения значений между некоторыми типами символьных строк.
F.4.5. Отображение значений существует между всеми значениями некоторого типа, определенного как целочисленный тип с поименованными значениями, и любого целочисленного типа, определенного без поименованных значений, с другими поименованными значениями, с другими именами поименованных значений или с другими поименованными значениями и именами одновременно.
Примечание. Существование отображения значений не влияет на требования правила области действия имен и поименованных значений. Они могут использоваться только в области действия, управляемой типом, в котором они определены, или ссылкой на имя этого типа.
F.4.6. Отображение значений существует по определению между всеми значениями любого типа, определенного как битовая строка с поименованными битами, и любого типа, определенного как битовая строка без поименованных битов, с другими поименованными битами, с другими именами поименованных битов или с другими поименованными битами и менами одновременно.
Примечание. Существование отображения значений не влияет на требования правила области действия имен и поименованных битов. Они могут использоваться только в области действия, управляемой типом, в котором они определены, или ссылкой на имя этого типа.
F.5.1. Имеется две группы ограниченных типов символьных строк: группа A (F.5.2) и B (F.5.3). По определению, отображения значений существуют между всеми типами в группе A и ссылки на их значения могут использоваться, когда они управляются одним из этих типов. Отображения значений никогда не существуют между разными типами в группе B или между какими-либо типами из групп A и B.
F.5.2. Группа A состоит из:
UTF8String
NumericString
PrintableString
1A5String
VisibleString (ISO646String)
UniversalString
BMPString
TeletexString (T61String)
VideotexString
GraphicString
GeneralString
F.5.4. Отображения значений в группе A определяются отображением значений символьных строк каждого типа в UniversalString и использованием свойства транзитивности отображений значений. Для отображения значений одного из типов группы A в UniversalString строка заменяется на UniversalString той же длины и с отображением каждого символа так, как описано ниже.
F.5.5. Формально множество абстрактных значений UTF8String то же самое, что и множество абстрактных значений UniversalString, но с другим тегом (см. 36.13), и каждое абстрактное значение UTF8String по определению отображается в соответствующее абстрактное значение UniversalString.
F.5.6. Глифы (формы печатных символов), используемые для типов NumericString и PrintableString, распознаются и недвусмысленно отображаются в подмножество глифов, присвоенных первым 128 символам ИСО/МЭК 10646-1. Отображение для этих типов определяется через отображение глифов.
F.5.7. 1A5String и VisibleString отображаются в UniversalString путем отображения каждого символа в символ UniversalString, который имеет (32-битовое) значение в кодировании BER для UniversalString, идентичное (8-битовому) значению в кодировании BER для 1A5String и VisibleString.
F.5.8. BMPString формально является подмножеством UniversalString, и соответствующие абстрактные значения имеют отображения значений.
В данном разделе понятие отображения значений используется для точной формулировки допустимости некоторых конструкций АСН.1.
F.6.1. Любое появление "Value" в x-нотации с управляющим типом Y идентифицирует y-значение в управляющем типе Y, которое имеет отображение в x-значении, заданное x-нотацией. Требуется, чтобы такое значение существовало.
Например рассмотрим появление x в последней строке следующей записи:
X :: = [0] INTEGER (0 .. 30)
xX :: = 29
Y :: = [1] INTEGER (25 .. 35)
Z1 :: = Y (x | 30)
Эти конструкции АСН.1 допустимы и в последнем присваивании x-нотации, x являются указанием x-значения 29 в X и, через отображение значения, идентифицирует y-значение 29 в Y. x-нотация 30 является указанием на y-значение 30 в Y и Z1 является множеством значений 29 и 30. С другой стороны, присваивание
Z2 :: = Y (x | 20)
недопустимо, так как нет y-значения, на которое может указывать x-нотация 20.
F.6.2. Любое появление "Type" в t-нотации, которое имеет управляющий тип V, идентифицирует все множество значений в управляющем типе V, которые имеют отображения значений в любые значения в "Type" t-нотации. Требуется, чтобы это множество содержало по крайней мере одно значение.
Например рассмотрим появление W в последней строке следующей записи:
V :: = [0] INTEGER (0 .. 30)
W :: = [1] INTEGER (25 .. 35)
Y :: = [2] INTEGER (31 .. 35)
Z1:: = V (W | 24)
W привносит значения 25 - 30 в арифметическое множество, приводя к Z1, имеющему значения 24 - 30. С другой стороны, присваивание
Z2 :: = V (Y | 24)
недопустимо, так как нет значений в Y, которые отображались в значение в V.
F.6.3. Требуется, чтобы тип любого значения, подставленного в качестве фактического параметра, имел отображение из этого значения в одно из значений в типе, управляющем пустым параметром, и идентифицируется именно это значение в управляющем типе.
F.6.4. Если "Type" подставлен в качестве фактического для пустого параметра, который является пустым параметром множества значений, требуется, чтобы все значения этого "Type" имели отображения в значения в управляющем типе пустого параметра множества значений. Фактический параметр выбирает в управляющем типе полное множество значений, которые имеют отображения в "Type".
F.6.5. При спецификации типа A пустой параметр, который является параметром значения или множества значений, допустим только в том случае, если для всех значений A и для всех использований A в правой части присваивания эти значения A могут быть использованы вместо пустого параметра.
F.7.2. Пример 1
X :: = SEQUENCE X1 :: = SEQUENCE
{name Visible String, {name VisibleString,
age INTEGER} - - комментарий - -
age INTEGER}
X2 :: = [8] SEQUENCE X3 :: = SEQUENCE
{name VisibleString, {name VisibleString,
age INTEGER} age AgeType}
AgeType :: = INTEGER
X, X1, X2 и X3 являются определениями идентичных типов. Ни различие в пропусках и комментариях, ни использование ссылки на тип "AgeType" в X3 значения не имеют. Однако если изменить любой идентификатор элемента последовательности, то они перестанут быть идентичными определениями и между ними не будет отображения значений.
F.7.3. Пример 2
B :: = SET B1 :: = SET
{name VisibleString, {age INTEGER,
age INTEGER} name VisibleString}
Это определения идентичных типов при условии, что они не находятся в модуле, в заголовке которого стоит "AUTOMATIC TAGS"; в противном случае они не являются определениями идентичных типов и между ними не существуют отображения значений. Аналогичные примеры могут быть написаны для CHOICE и ENUMERATED (используя форму "identifier" для "EnumerationItem").
F.7.4. Пример 3
C :: = SET C1 :: = SET
{name [0] VisibleString, {name VisibleString,
age INTEGER} age INTEGER (1 .. 64)}
Это не определения идентичных типов, и ни одно из них не является определением идентичного типа с B или B1; также нет отображений значений между C и C1 или между этими типами и B или B1.
F.7.5. Пример 4
x INTEGER { Y (2)} :: = 3
z INTEGER :: = x
Это допустимо, и присваивается значение 3 через отображение, определенное в F.4.5.
F.7.6. Пример 5
b1 BIT STRING :: = '101'B
b2 BIT STRING {version1 (0), version2 (1), version3 (2)}:: = b1
Это допустимо и b2 присваивается значение {version1, version3}.
F.7.7. Пример 6
С определениями из F.1.1 элементы SEQUENCE вида
X DEFAULT y
допустимы, где 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 недопустимо, так как в этих случаях нет отображений значений из ссылки на значение по умолчанию на тип, для которого умолчание устанавливается.
(справочное)
РУКОВОДСТВО ПО МОДЕЛИ РАСШИРЕНИЯ ТИПА АСН.1
G.1. Обзор
G.1.1. Может случиться так, что тип АСН.1 с течением времени выходит за корень расширения с помощью серии расширений, называемых расширяющими дополнениями.
G.1.2. Тип АСН.1, доступный конкретной реализации, может быть типом корня расширения или типом корня расширения плюс одно или несколько расширяющих дополнений. Каждый тип АСН.1, содержащий расширяющее дополнение, содержит и все ранее определенные расширяющие дополнения.
G.1.3. Говорят, что определения типов АСН.1 в этой последовательности являются связанными расширением (более точное определение понятия "связанные расширением" см. в 3.8.32), и требуется, чтобы правила кодирования применялись к связанным расширением типам таким образом, что если две системы используют два разных связанных расширением типа, то между ними будут успешно переданы те части информации содержимого этих типов, которая является общей для двух систем. Кроме того, требуется, чтобы части, не являющиеся общими для обеих систем, могли быть выделены и в последующем ретранслированы (возможно, третьей стороне) при условии использования того же синтаксиса передачи.
Примечание. Отправитель может использовать тип, который находится в последовательности расширяющих дополнений как раньше, так и позже.
G.1.4. Последовательность типов, полученная добавлениями к корневому типу, называется серией расширений. Для того чтобы правила кодирования могли обеспечить соответствующую передачу связанных расширением типов (которая может потребовать больше битов в строке), такие типы (включая корень расширения) должны быть отмечены синтаксически. Признаком является многоточие (...) и называется маркером расширения.
Пример
Корень расширения 1-е расширение 2-е расширение 3-е расширение
A :: = SEQUENCE { A :: = SEQUENCE { A :: = SEQUENCE { A :: = SEQUENCE {
a INTEGER, a INTEGER, a INTEGER, a INTEGER,
... ..., ..., ...,
} b BOOLEAN, b BOOLEAN, b BOOLEAN,
c INTEGER c INTEGER, c INTEGER,
} d SEQUENCE { d SEQUENCE {
e INTEGER, e INTEGER,
..., ...,
..., g BOOLEAN OPTIONAL,
fIA5String h BMPString,
} ...,
} f IA5String
}
}
G.1.5. Все расширяющие дополнения вставляются между парами маркеров расширения. Единственный маркер расширения допустим, если в корне расширения он стоит последним элементом типа; в этом случае принимается, что парный ему маркер расширения стоит непосредственно перед закрывающей фигурной скобкой типа, а расширяющие дополнения вставляются в конец типа.
G.1.6. Тип, имеющий маркер расширения, может быть вложен либо в тип, не имеющий такого маркера, либо в тип в корне расширения, либо в тип расширяющего дополнения. В таких случаях серии расширений трактуются независимо друг от друга и вложенный тип с маркером расширения не влияет на тип, в который он вложен. В любой конкретной конструкции может быть только одна точка вставки расширения (в конце типа, если используется единственный маркер расширения, или непосредственно перед вторым маркером расширения, если используется пара маркеров расширения).
G.1.7. Новое расширяющее дополнение в серии расширений определяется в терминах расширяющей дополнительной группы (из одного или нескольких типов, заключенных между "[[" и "]]"), или единственного типа, добавленного в точке вставки расширения. В следующем примере первое расширение определяет расширяющую дополнительную группу, когда b, c должны одновременно присутствовать или отсутствовать в значении типа A. Второе расширение определяет единственный тип компонента d, который может отсутствовать в значении типа A. Третье расширение определяет расширяющую дополнительную группу, в которой компонент h должен присутствовать в значении типа A всякий раз, когда в нем есть новая расширяющая дополнительная группа.
Пример
Корень расширения 1-е расширение 2-е расширение 3-е расширение
A :: = SEQUENCE { A :: = SEQUENCE { A :: = SEQUENCE { A :: = SEQUENCE {
a INTEGER, a INTEGER, a INTEGER, a INTEGER,
... ..., ..., ...,
} [[ [[ [[
b BOOLEAN, b BOOLEAN, b BOOLEAN,
c INTEGER c INTEGER, c INTEGER,
]] ]], ]],
} d SEQUENCE { d SEQUENCE {
e INTEGER, e INTEGER,
..., ...,
..., [[
f IA5String g BOOLEAN OPTIONAL,
} h BMPString,
} ]],
...,
f IA5String
}
}
G.1.8. Хотя обычной практикой должно стать добавление со временем расширяющих дополнений, используемые модель и спецификация АСН.1 не содержат время. Два типа являются связанными расширением, если один может быть "выращен" из другого расширяющими дополнениями. Таким образом, один тип содержит все компоненты другого. Могут быть типы, которые "наращиваются" в противоположном направлении (хотя это маловероятно). Это может произойти, если тип начинается (во времени) с большого количества расширений, которые последовательно удаляются. Все, что передает АСН.1 и ее правила кодирования, является две спецификации типов, связанные или не связанные расширением. Если они связаны, то все правила кодирования АСН.1 должны обеспечивать взаимодействие между их пользователями.
G.1.9. Обычно начинают с некоторого типа и затем решают, хотят ли взаимодействовать с предшествующими версиями, если они были расширены. Если это так, то включают маркер расширения. Затем к типу можно добавить последующие расширяющие дополнения без изменения битов в строке для более ранних значений, но с определенной обработкой расширенных значений ранними системами. Существенно отметить, что добавление маркера расширения к типу, который ранее его не имел, или удаление существующего маркера расширения в общем случае изменит биты в строке и будет препятствовать взаимодействию. Такие изменения в общем случае потребуют изменения версий всех задействованных протоколов.
G.1.10. В таблице G.1 приведены типы АСН.1, которые могут быть типом корня расширения для последовательности расширений АСН.1, и виды единичных расширяющих дополнений, допустимых для этого типа (конечно, кратные расширяющие дополнения могут быть сделаны последовательно или одновременно).
Таблица G.1
Расширяющие дополнения
G.2. Влияние на нумерацию версий
G.2.1. Когда спецификация АСН.1 используется повторно с определениями типов, измененными в терминах определений, связанных расширением типов, то для любых задач эти изменения сами по себе не требуют изменения идентификатора объекта модуля или номера версии протокола.
G.2.2. Может быть так, что по некоторым другим причинам такие изменения должны сопровождаться изменением номера версии, но это не является обязательным требованием.
G.2.3. Напротив, добавление маркера расширения к типу, который ранее его не имел, или добавление компонентов к типу "последовательность" или "множество" без маркера расширения создает новый тип, который не связан расширением со старым, и содержащему его модулю должен быть присвоен новый идентификатор объекта, а с протоколом должен быть связан новый номер версии.
G.3. Требования к правилам кодирования
G.3.1. Абстрактный синтаксис может быть определен как значения единственного типа АСН.1, который является расширяемым. Он содержит все значения, которые могут быть получены добавлением или удалением расширяющих дополнений. Такой абстрактный синтаксис называется связанным расширением абстрактным синтаксисом.
G.3.2. Набор правильно созданных правил кодирования для связанного расширением абстрактного синтаксиса удовлетворяет дополнительным требованиям, установленным в G.3.3 - G.3.5.
Примечание. Правила кодирования АСН.1 удовлетворяют этим требованиям.
G.3.3. Определение процедур для преобразования абстрактного значения в кодирование для передачи и преобразования полученного кодирования в абстрактное значение должно распознавать возможность того, что отправитель и получатель используют разные абстрактные синтаксисы, которые не идентичны, но связаны расширением.
G.3.4. В этом случае правила кодирования должны гарантировать, что когда отправитель имеет спецификацию, более раннюю в серии расширений, чем получатель, то значения отправителя должны быть преобразованы таким образом, чтобы получатель мог определить, что расширяющие дополнения отсутствуют.
G.3.5. Правила кодирования должны гарантировать, что когда отправитель имеет спецификацию типа, которая является более поздней в серии расширений, чем спецификация получателя, то передача значений этого типа получателю остается возможной.
(справочное)
СВОДКА НОТАЦИИ АСН.1
Следующие элементы определены в разделе 11:
typereference BEGIN ISO646String
identifier BIT MAX
valuereference BMPString MIN
modulereference BOOLEAN MINUS-INFINITY
comment BY NULL
empty CHARACTER NumericString
number CHOICE OBJECT
bstring CLASS ObjectDescriptor
hstring COMPONENT OCTET
cstring COMPONENTS OF
":: =" CONSTRAINED OPTIONAL
".." DEFAULT PDV
"..." DEFINITIONS PLUS-INFINITY
"{" EMBEDDED PRESENT
"}" END PrintableString
"<" ENUMERATED PRIVATE
"," EXCEPT REAL
"." EXPLICIT SEQUENCE
"(" EXPORTS SET
")" EXTERNAL SIZE
"[" FALSE STRING
"]" FROM SYNTAX
"-" GeneralizedTime T61String
":" GeneralString TAGS
";" GraphicString TeletexString
"@" IA5String TRUE
"|" TYPE-IDENTIFIER UNION
"!" IDENTIFIER UNIQUE
"
ABSENT IMPORTS UniversalString
ABSTRACT-SYNTAX INCLUDES UTCTime
ALL INSTANCE VideotexString
APPLICATION INTEGER VisibleString
AUTOMATIC INTERSECTION WITH
В настоящем стандарте использованы следующие продукции с указанными выше элементами в качестве терминальных символов:
ModuleDefinition :: = ModuleIdentifier
DEFINITIONS
TagDefault
":: ="
BEGIN
ModuleBody
END
ModuleIdentifier :: = modulereference
DefinitiveIdentifier
DefinitiveIdentifier :: = "{" DefinitiveObjIdComponentList "}" | empty
DefinitiveObjIdComponentList :: =
DefinitiveObjIdComponent |
DefinitiveObjIdComponent DefinitiveObjIdComponentList
DefinitiveObjIdComponent :: =
Name Form |
DefinitiveNumberForm |
DefinitiveNameAndNumberForm
DefinitiveNumberForm :: = number
DefinitiveNameAndNumberForm :: = identifier "(" DefinitiveNumberForm")
TagDefault :: = EXPLICIT TAGS |
IMPLICIT TAGS |
AUTOMATIC TAGS |
empty
ExtensionDefault :: =
EXTENSIBILITY IMPLIED |
empty
ModuleBody :: = Exports Imports AssignmentList |
empty
Exports :: = EXPORTS Symbols Exported ";" |
empty
Symbols Exported :: = SymbolList |
empty
Imports :: = IMPORTS SymbolsImported ";" |
empty
SymbolsImported :: = SymbolsFromModuleList |
empty
SymbolsFromModuleList :: =
SymbolsFromModule |
SymbolsFromModuleList SymbolsFromModule
SymbolsFromModule :: SymbolList FROM GlobalModuleReference
GlobalModuleReference :: = modulereference AssignedIdentifier
AssignedIdentifier :: = ObjectIdentifierValue |
DefinedValue |
empty
SymbolList :: = Symbol | Symbol "," SymbolList
Symbol :: = Reference | ParameterizedReference
Reference :: =
typereference |
valuereference |
objectclassreference |
objectreference |
objectsetreference
AssignmentList :: = Assignment | AssignmentList Assignment
Assignment :: =
TypeAssignment |
ValueAssignment |
ValueSetTypeAssignment |
ObjectClassAssignment |
ObjectAssignment |
ObjectSetAssignment |
ParameterizedAssignment
Externaltypereference :: =
modulereference
"."
typereference
Externalvaluereference :: =
modulereference
"."
valuereference
DefinedType :: =
Externaltypereference |
typereference |
ParameterizedType |
ParameterizedValueSetType
DefinedValue :: =
Externalvaluereference |
valuereference |
ParameterizedValue
AbsoluteReference :: = "@" GlobalModuleReference
"."
ItemSpec
ItemSpec :: =
typereference |
ItemId "." ComponentId
ItemId :: = ItemSpec
ComponentId :: =
identifier | number | "H"
TypeAssignment :: = typereference
":: ="
Type
ValueAssignment :: = valuereference
Type
":: ="
Value
ValueSetTypeAssignment :: = typereference
Type
":: ="
ValueSet
ValueSet :: = "{" ElementSetSpec "}"
Type :: = BuiltinType | ReferencedType | ConstrainedType
BuiltinType :: =
BitStringType |
BooleanType |
CharacterStringType |
ChoiceType |
EmbeddedPDVType |
EnumeratedType |
ExternalType |
InstanceOfType |
IntegerType |
NullType |
ObjectClassFieldType |
ObjectldentifierType |
OctetStringType |
RealType |
SequenceType |
SequenceOfType |
SetType |
SetOfType |
TaggedType
NamedType :: = identifier Type | SelectionType
ReferencedType :: =
DefinedType |
UsefulType |
SelectionType |
TypeFromObject |
ValueSetFromObjects
Value :: = BuiltinValue | ReferencedValue
BuiltinValue :: =
BitStringValue |
BooleanValue |
CharacterStringValue |
ChoiceValue |
EmbeddedPDVValue |
EnumeratedValue |
ExternalValue |
InstanceOfValue |
IntegerValue |
NullValue |
ObjectClassFieldValue |
ObjectIdentifierValue |
OctetStringValue |
RealValue |
SequenceValue |
SequenceOfValue |
SetValue |
SetOfValue |
TaggedValue
ReferencedValue :: =
DefinedValue |
ValueFromObject
NamedValue :: = identifier Value
BooleanType :: = BOOLEAN
BooleanValue :: = TRUE | FALSE
Integer Type :: =
INTEGER |
INTEGER "{" NamedNumberList "}"
NamedNumberList :: =
NamedNumber |
NamedNumberList "," NamedNumber
NamedNumber :: =
identifier "(" SignedNumber ")" |
identifier "(" DefinedValue ")"
SignedNumber :: = number | "-" number
IntegerValue :: = SignedNumber | identifier
EnumeratedType :: =
ENUMERATED "{" Enumerations "}"
Enumerations :: = RootEnumeration |
RootEnumeration "," "..." |
RootEnumeration "," "..." "," AdditionalEnumeration
RootEnumeration :: = Enumeration
AdditionalEnumeration :: = Enumeration
Enumeration :: =
EnumerationItem | EnumerationItem "," Enumeration
EnumerationItem :: =
identifier | NamedNumber
EnumeratedValue :: =
identifier
RealType :: = REAL
RealValue :: =
NumericRealValue | SpecialRealValue
NumericRealValue:: = 0 |
SequenceValue - - Значение ассоциированного типа "последовательность"
SpecialRealValue :: =
PLUS-INFINITY | MINUS-INFINITY
BitStringType :: = BIT STRING | BIT STRING "{" NamedBitList "}"
NamedBitList :: = NamedBit | NamedBitList"," NamedBit
NamedBit :: = identifier "(" number ")" |
identifier "(" DefinedValue ")"
BitStringValue :: = bstring | hstring |"{" IdentifierList"}" | "{""}"
IdentifierList :: = identifier | IdentifierList "," identifier
OctetStringType :: = OCTET STRING
OctetStringValue :: = bstring | hstring
NullType :: = NULL
NullValue :: = NULL
SequenceType :: = SEQUENCE "{" "}" |
SEQUENCE "{" ExtensionAndException OptionalExtensionMarker "}" |
SEQUENCE "{" ComponentTypeLists "}"
ExtensionAndException :: = "..." | "..." ExceptionSpec
OptionalExtensionMarker :: = ",""..." | empty
ComponentTypeLists :: = RootComponentTypeList |
RootComponentTypeList "," ExtensionAndException ExtensionAdditions
OptionalExtensionMarker |
RootComponentTypeList "," ExtensionAndException ExtensionAdditions
ExtensionEndMarker "," RootComponentTypeList |
ExtensionAndException ExtensionAdditions ExtensionEndMarker ","
RootComponentTypeList
RootComponentTypeList :: = ComponentTypeList
ExtensionEndMarker :: = "," "..."
ExtensionAdditions :: = "," ExtensionAdditionList | empty
ExtensionAdditionList :: = ExtensionAddition | ExtensionAdditionList","
ExtensionAddition
ExtensionAddition :: = ComponentType | ExtensionAdditionGroup
ExtensionAdditionGroup :: = "[[" ComponentTypeList "]]"
ComponentTypeList :: = ComponentType | ComponentTypeList "," ComponentType
ComponentType :: = NamedType |
NamedType OPTIONAL |
NamedType DEFAULT Value |
COMPONENTS OF Type
SequenceValue :: = "{" Component ValueList "}" | "{" "}"
ComponentValueList :: = NamedValue | ComponentValueList"," NamedValue
SequenceOfType :: = SEQUENCE OF Type
SequenceOfValue :: = "{" ValueList "}" | "{" "}"
ValueList :: = Value | ValueList "," Value
SetType :: = SET "{""}" |
SET "{" ExtensionAndException OptionalExtensionMarker "}" |
SET "{" ComponentTypeLists "}"
SetValue :: = "{" ComponentValueList "}" | "{" "}"
SetOfType :: = SET OF Type
SetOfValue :: = "{" ValueList "}" | "{" "}"
ChoiceType :: = CHOICE "{" AlternativeTypeLists "}"
AlternativeTypeLists :: =
RootAlternativeTypeList |
RootAlternativeTypeList "," ExtensionAndException
ExtensionAdditionAlternatives OptionalExtensionMarker
RootAlternativeTypeList :: = AlternativeTypeList
ExtensionAdditionAlternatives :: =
"," ExtensionAdditionAlternativesList | empty
ExtensionAdditionAlternativesList :: = ExtensionAdditionAlternative |
ExtensionAdditionAlternativesList ","
ExtensionAdditionAlternative
ExtensionAdditionAlternative :: = ExtensionAdditionAlternatives |
NamedType
ExtensionAdditionAlternatives :: = "[[" AlternativeTypeList "]]"
AlternativeTypeList :: = NamedType | AlternativeTypeList "," NamedType
Choice Value :: = identifier ":" Value
SelectionType :: = identifier "<" Type
TaggedType :: = Tag Type |
Tag IMPLICIT Type |
Tag EXPLICIT Type
Tag :: = "[" Class ClassNumber "]"
ClassNumber :: = number | Defined Value
Class :: = UNIVERSAL |
APPLICATION |
PRIVATE |
empty
Tagged Value :: = Value
EmbeddedPDVType :: = EMBEDDED PDV
EmbeddedPDVValue :: = SequenceValue
ExternalType :: = EXTERNAL
ExternalValue :: = SequenceValue
ObjectIdentifierType :: = OBJECT IDENTIFIER
ObjectIdentifierValue :: = "{" ObjIdComponentList "}" |
"{" DefinedValue ObjIdComponentList "}"
ObjIdComponentList :: = ObjIdComponent |
ObjIdComponent ObjIdComponentList
ObjIdComponent :: = NameForm |
NumberForm |
NameAndNumberForm
NameForm :: = identifier
NumberForm :: = number | DefinedValue
NameAndNumberForm :: = identifier "(" NumberForm ")"
CharacterStringType :: = RestrictedCharacterStringType |
UnrestrictedCharacterStringType
RestrictedCharacterStringType :: = BMPString |
GeneralString |
GraphicString |
1A5String |
ISO646String |
NumericString |
PrintableString |
TeletexString |
T61String |
UniversalString |
VideotexString |
VisibleString
RestrictedCharacterStringValue :: = cstring | CharacterStringList |
Quadruple | Tuple
CharacterStringList :: = "{" CharSyms "}"
CharSyms :: = CharsDefn | CharSyms "," CharsDefn
CharsDefn :: = cstring | DefinedValue
Quadruple :: = "{" Group "," Plane "," Row "," Cell "}"
Group :: = number
Plane :: = number
Row :: = number
Cell :: = number
Tuple :: = "{" TableColumn "," TableRow "}"
TableColumn :: = number
TableRow :: = number
UnrestrictedCharacterStringType :: = CHARACTER STRING
CharacterStringValue :: = RestrictedCharacterStringValue |
UnrestrictedCharacterStringValue
UnrestrictedCharacterStringValue :: = SequenceValue
UsefulType :: = typereference
Следующие типы символьных строк определены в 36.1:
NumericString VisibleString
PrintableString ISO646String
TeletexString IA5String
T61String GraphicString
VideotexString GeneralString
UniversalString BMPString
Следующие полезные типы определены в разделах 39 - 41:
GeneralizedTime
UTCTime
ObjectDescriptor
Следующие продукции используются в разделах 42 - 45:
ConstrainedType :: =
Type Constraint |
TypeWithConstraint
TypeWithConstraint :: =
SET Constraint OF Type |
SET SizeConstraint OF Type |
SEQUENCE Constraint OF Type |
SEQUENCE SizeConstraint OF Type
Constraint :: = "(" ConstraintSpec ExceptionSpec ")"
ConstraintSpec :: =
SubtypeConstraint |
GeneralConstraint
ExceptionSpec :: = "!" ExceptionIdentification | empty
ExceptionIdentification :: = SignedNumber |
DefinedValue |
Type ":" Value
SubtypeConstraint :: = ElementSetSpec
ElementSetSpecs :: =
RootElementSetSpec |
RootElementSetSpec "," "..." |
RootElementSetSpec "," "...""," AdditionalElementSetSpec
RootElementSetSpec :: = ElementSetSpec
AdditionalElementSetSpec :: = ElementSetSpec
ElementSetSpec :: = Unions | ALL Exclusions
Unions :: = Intersections |
UElems UnionMark Intersections
UElems :: = Unions
Intersections :: = IntersectionElements | IElems IntersectionMark
IntersectionElements
IElems :: = Intersections
IntersectionElements :: = Elements | Elems Exclusions
Elems :: = Elements
Exclusions :: = EXCEPT Elements
UnionMark :: = "|" | UNION
IntersectionMark :: = "
Elements :: =
SubtypeElements |
ObjectSetElements |
"(" ElementSetSpec ")"
SubtypeElements :: =
SingleValue |
ContainedSubtype |
ValueRange |
PermittedAlphabet |
SizeConstraint |
TypeConstraint |
InnerTypeConstraints
SingleValue :: = Value
ContainedSubtype :: = Includes Type
Includes :: = INCLUDES | empty
Value Range :: = LowerEndpoint ".." UpperEndpoint
LowerEndpoint :: = LowerEndValue | LowerEndValue "<"
UpperEndpoint :: = UpperEndValue | "<" UpperEndValue
LowerEndValue :: = Value | MIN
UpperEndValue :: = Value | MAX
SizeConstraint :: = SIZE Constraint
PermittedAlphabet :: = FROM Constraint
TypeConstraint :: = Type
InnerTypeConstraints :: =
WITH COMPONENT SingleTypeConstraint |
WITH COMPONENTS MultipleTypeConstraints
SingleTypeConstraint :: = Constraint
MultipleTypeConstraints :: = FullSpecification | PartialSpecification
FullSpecification :: "{" TypeConstraints "}"
Partial Specification :: = "{" "...""," TypeConstraints "}"
TypeConstraints :: =
NamedConstraint |
NamedConstraint "," TypeConstraints
NamedConstraint :: =
identifier ComponentConstraint
ComponentConstraint :: = ValueConstraint PresenceConstraint
ValueConstraint :: = Constraint | empty
PresenceConstraint :: = PRESENT | ABSENT | OPTIONAL | empty
Вернуться в "Каталог нормативных документов"
Источник информации: https://internet-law.ru/documents/prod/gost-r_gosudarstvennyj-standart/46/gost_63243.html
На правах рекламы:
|