Откройте актуальную версию документа прямо сейчас
Если вы являетесь пользователем интернет-версии системы ГАРАНТ, вы можете открыть этот документ прямо сейчас или запросить по Горячей линии в системе.
Приложение C
(справочное)
Примеры и указания
Настоящее приложение содержит примеры использования АСН.1 при описании (гипотетических) структур данных. Оно так же содержит указания, или руководства по использованию различных характеристик АСН.1. Если не оговорено противное, то принимается окружение автоматического тегирования AUTOMATIG TAGS.
С.1 Пример персональной записи
Использование АСН.1 иллюстрируется на примере простейшей гипотетической персональной записи.
С.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
С.1.2 Описание АСН.1 структуры записи
Структура каждой персональной записи ниже описана формально с использованием стандартной нотации для типов данных:
PersonnelRecord : : = [APPLICATION 0] SET
{ name Name,
title VisibleString,
number EmployeeNumber,
dateOfHire Date,
nameOfSpouse Name,
children SEQUENCE OF ChildInformation DEFAULT {}
}
ChildInformation : : = 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"}
}
}
С.2 Руководство по использованию нотации
Типы данных и формальная нотация, определенные в настоящем стандарте, являются гибкими и позволяют проектировать широкий диапазон протоколов. Однако эта гибкость иногда может приводить к путанице, особенно когда нотация используется впервые. Данное приложение является попыткой минимизировать возможную путаницу и дает руководство (и примеры) использования нотации. Для каждого встроенного типа приводится одно или несколько указаний по его использованию. Типы символьных строк (например VisibleString) и типы, определенные в разделах 41-43, здесь не рассматриваются.
С.2.1 Булевский тип
С.2.1.1 Булевский тип используется для моделирования логических значений, например ответов да-нет на поставленные вопросы.
Пример
Employed : : = BOOLEAN
С.2.1.2 При назначении ссылочного имени булевскому типу выбирается то имя, которое описывает состояние "истинно".
Пример
Married : : = BOOLEAN - - женат
но не
MaritalStatus : : = BOOLEAN - - семейное положение
С.2.2 Целочисленный тип
С.2.2.1 Целочисленный тип используется для моделирования значений (практически не ограниченных) кардинальных или целочисленных переменных.
Пример
CheckingAccountBalance : : = INTEGER - - баланс в центах,
- - отрицательное значение означает перерасход
balance CheckingAccountBalance : : = 0
С.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
С.2.3 Перечислимый тип
С.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" и т.д., а эквивалентные целочисленные значения недопустимы.
С.2.3.2 Расширяемый перечислимый тип используется для моделирования значений переменной, которая в настоящее время имеет два состояния, но может иметь дополнительные состояния в последующих версиях протокола.
Пример
MaritalStatus : : = ENUMERATED {single, marriеd}
- - Первая версия записи
- - семейного положения: одинокий, женатый
в предвидении
MaritalStatus : : = ENUMERATED{single, marriеd, ... , widowed}
- - Вторая версия записи
- - семейного положения: одинокий, женатый, вдовый
и далее
MaritalStatus : : = ENUMERATED{single, marriеd, ... , widowed, divorced}
- - Третья версия записи
- - семейного положения: одинокий, женатый, вдовый, разведенный
С.2.4 Действительный тип
С.2.4.1 Действительный тип используется для моделирования приближенных чисел.
Пример
AngleInRadians : : = REAL - - угол в радианах
pi REAL : : = {mantissa 3141592653589793238462643383279, base 10, exponent - 30}
С.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}
С.2.5 Битовая строка
С.2.5.1 Битовая строка используется для моделирования двоичных данных, формат и длина которых не заданы или заданы где-либо в другом месте, а длина в битах не обязательно кратна восьми.
Пример
G3FacsimilePage : : = BIT STRING
- - последовательность битов, соответствующая Рекомендации МККТТ Т. 4
image G3FacsimilePage : : = '100110100100001110110'B
trailer BIT STRING : : = '0123456789ABCDEF'H
body1 G3FacsimilePage : : = '1101'B
body2 G3FacsimilePage : : = '1101000'B
Нотации "body1" и "body2" являются разными абстрактными значениями, так как завершающие нулевые биты являются значащими (так как отсутствует конструкция "NamedBitList" в определении G3FacsimilePage).
С.2.5.2 Битовая строка с ограничением размера используется для моделирования значений битовых полей фиксированного размера.
Пример
BitField : : = BIT STRING (SIZE (12))
map1 BitField : : = '100110100100'B
map2 BitField : : = '9A4'H
map3 BitField : : = '1001101001'B
- - Недопустимо - нарушено ограничение размера
Нотации "map1" и "map2" являются одинаковыми абстрактными значениями, так как завершающие четыре нулевых бита в "map2" не являются значащими.
С.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'В
sunnyDaysLastWeek3 DaysOfTheWeek : : = '1101000'В
sunnyDaysLastWeek4 DaysOfTheWeek : : = '11010000'В
- - Недопустимо - нарушено ограничение размера
Если значение битовой строки короче 7 бит, то отсутствующие биты указывают пасмурный день, следовательно первые три приведенные нотации имеют одно и то же абстрактное значение.
С.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'В
- - Недопустимо - нарушено ограничение размера
sunnyDaysLastWeek3 DaysOfTheWeek : : = '1101000'В
sunnyDaysLastWeek4 DaysOfTheWeek : : = '11010000'В
- - Недопустимо - нарушено ограничение размера
Первая и третья нотации имеют одно и то же абстрактное значение.
С.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" имеют одно и то же абстрактное значение.
С.2.6 Строка октетов
С.2.6.1 Строка октетов используется для моделирования двоичных данных, формат и длина которых не заданы или заданы где-либо в другом месте, а длина в битах кратна восьми.
Пример
G4FacsimileImage : : = OCTET STRING
- - последовательность октетов,
- - соответствующая Рекомендациям МККТТ Т. 5 и Т. 6
image G4FacsimilePage : : = '3FE2EBAD471005'H
С.2.6.2 Использование ограниченной символьной строки предпочтительнее строки октетов, когда обе из них приемлемы.
Пример
Surname : : = PrintableString
president Surname : : = "Clinton"
С.2.7 Строки Universal String и BMPString
Тип BМРString используется для моделирования любых строк информации, полностью состоящих из символов базовой многоязычной плоскости (ВМР) ИСО/МЭК 10646-1, а тип UniversalString - для моделирования строк, состоящих из символов ИСО/МЭК 10646-1, не входящих в ВМР.
С.2.7.1 Для обозначения уровня реализации, накладывающего ограничения на использование комбинированных символов, используются обозначения "Level1" и "Level2".
Пример
RussianName : : = Cyrillic (Level1)
- - B RussianName не используются комбинированные символы
SaudiName : : = BasicArabic (SIZE (1 ... 100)^Level2)
- - B SaudiName используется подмножество комбинированных символов
С.2.7.2 Совокупность может быть расширена до выбранного подмножества путем использования нотации "UnionMark" (см. раздел 44).
Пример
KatakanaAndBasicLatin : : = UniversalString (FROM(Katakana | BasicLatin))
С.2.8 Тип CHARACTER STRING
Неограниченный тип символьных строк используется для моделирования любых строк информации, которые не могут быть смоделированы ни одним из ограниченных типов символьных строк. Необходимо гарантировать спецификацию репертуара символов и их кодирования в октетах.
Пример
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 в форме, которая всегда включает в себя значения идентификаторов объектов, хотя они гарантируют, что абстрактное значение сохраняется при кодировании.
С.2.9 Вырожденный тип
Вырожденный тип null используется для указания отсутствия компонента последовательности.
Пример
PatientIdentifier : : = SEQUENCE {
name VisibleString,
roomNumber CHOICE {
room INTEGER,
outPatient NULL - - если пациент выписан - -
}
}
lastPatient PatientIdentifier : : = {
name "Jane Doe",
roomNumber outPatient : NULL
}
С.2.10 Последовательность и последовательность-из
С.2.10.1 Тип "последовательность-из" используется для моделирования совокупности переменных, тип которых один и тот же, количество велико или непредсказуемо, а порядок - существенен.
Пример
NamesOfMemberNations : : = SEQUENCE OF VisibleString
- - в алфавитном порядке
firstTwo NamesOfMemberNations : : = {"Australia", "Austria"}
С.2.10.2 Тип "последовательность" используется для моделирования совокупности переменных, тип которых один и тот же, количество известно и невелико, а порядок - существенен, при условии, что введенная разметка совокупности вряд ли изменится в последующих версиях протокола.
Пример
NamesOfOfficers : : = SEQUENCE {
president VisibleString,
vicePresident VisibleString,
secretary VisibleString}
- - Перечень официальных лиц: президент, вицепрезидент, секретарь
acmeCorp NamesOfOfficers : : =
president "Jane Doe",
vicePresident "John Doe",
secretary "Joе Doe"}
С.2.10.3 Тип "последовательность" используется для моделирования совокупности переменных, типы которых различны, количество известно и невелико, а порядок - существенен, при условии, что введенная разметка совокупности вряд ли изменится в последующих версиях протокола.
Пример
Credentials : : = SEQUENCE {
userName VisibleString,
password VisibleString,
accountNumber INTEGER}
С.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
]],
...
}
С.2.11 Множество и множество-из
С.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
- - по умолчанию - данная страна - - }
С.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"
}
С.2.11.4 Тип "множество-из" используется для моделирования совокупности переменных, тип которых один и тот же, а порядок - не существенен.
Пример
Keywords : : = SET OF VisibleString - - в произвольном порядке
someASN1Keywords Keywords : : = {"INTEGER", "ROOLEAN", "REAL"}
С.2.12 Тегирование
До введения конструкции AUTOMATIC TAGS спецификации АСН.1 часто содержали теги. Ниже описывается способ, с которым обычно применялось тегирование. С введением конструкции AUTOMATIC TAGS в новых спецификациях АСН.1 нет необходимости использовать обозначения тегов, хотя при модификациях старой нотации следует позаботиться о тегах.
С.2.12.1 Теги универсального класса используются только в настоящем стандарте. Например нотация [UNIVERSAL 30] предназначена исключительно для обеспечения точности в определении международно стандартизованных полезных типов. Иначе она не должна использоваться.
С.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 }
С.2.12.4 Тегирование пользовательского класса обычно не используется в спецификациях стандартов (хотя это и не запрещается). Приложения, созданные производителями, обычно будут использовать теги прикладного и контекстно зависящего классов. Однако в редких случаях спецификация конкретного производителя будет расширять спецификацию стандарта, и в этих случаях использование тегов пользовательского класса может дать некоторые преимущества в части защиты спецификации производителя от изменений спецификации стандарта.
Пример
AcmeBadgeNumber : : = [PRIVATE 2] INTEGER
badgeNumber AcmeBadgeNumber : : = 2345
С.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 }
С.2.12.6 Руководство по использованию тегов в новых спецификациях АСН.1, ссылающихся на настоящий стандарт, очень простое: НЕ ИСПОЛЬЗУЙТЕ ТЕГИ. Вставьте в заголовок модуля AUTOMATIC TAGS - и забудьте о тегах. Если в последующей версии вам необходимо добавить новые компоненты к множеству SET, последовательности SEQUENCE или выбору CHOICE, добавьте их в конце.
С.2.13 Выбор
С.2.13.1 Выборочный тип CHOICE используется для моделирования переменных, выбираемых из совокупности переменных, число которых известно и невелико.
Пример
FileIdentifier : : = CHOICE { - - идентификатор файла
relativeName VisibleString,
- - имя файла (например, "MarchProgressReport")
absoluteName VisibleString,
- - имя файла и содержащего его каталога
- - (например, "<Williams> MarchProgressReport")
serialNumber INTEGER
- - системный идентификатор файла - - }
file FileIdentifier : : = serialNumber : 106448503
С.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
С.2.13.3 Расширяемый выборочный тип CHOICE из единственного типа используется, когда рассматривается возможность, что в будущем будут допустимы несколько типов.
Пример
Greeting : : = CHOISE { - - Первая версия Greeting
postCard VisibleString
...,
...
}
в предвидении:
Greeting : : = CHOISE { - - Вторая версия Greeting
postCard VisibleString,
...,
[[ - - Расширяющее дополнение к второй версии
audio Audio,
video Video
...
}
С.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
С.2.14 Селективный тип
С.2.14.1 Селективный тип используется для моделирования переменной, тип которой есть тип некоторой конкретной альтернативы в определенном ранее выборе CHOICE.
С.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" }
С.2.15 Тип "поле класса объектов"
С.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 является открытым типом.
С.2.16 Встроенное-здп
С.2.16.1 Тип "встроенное-здп" используется для моделирования переменных, тип которых не задан или задан где-либо в другом месте, без ограничения на нотацию, используемую для спецификации типа.
Пример
FileContents : : = EMBEDDED PDV - - содержимое файла
DocumentList : : = SEQUENCE OF EMBEDDED PDV - - список документов
С.2.17 Внешний тип
Внешний тип похож на встроенное-здп, но имеет меньше идентификационных опций. В новых спецификациях предпочтительнее использовать встроенное-здп из-за его большей гибкости и того обстоятельства, что некоторые правила кодирования представляют его значения более эффективно.
С.2.18 Экземпляр-из
С.2.18.1 Экземпляр-из используется для спецификации типа, содержащего поле идентификатора объекта и открытый тип, значение которого есть тип, определенный идентификатором объекта. Тип "экземпляр-из" ограничен тем, что может переносить значение из класса TYPE-IDENTIFIER (см. ГОСТ Р ИСО/МЭК 8824-2, приложения А и С).
Пример
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, которое содержит только идентификатор объекта и значение данных.
С.3 Идентификация абстрактных синтаксисов
С.3.1 Использование услуг уровня представления (ГОСТ 34.971) требует спецификации значений, называемых значениями данных (уровня) представления, и объединений этих значений данных представления в множества, называемые абстрактными синтаксисами. Каждому из этих множеств дано имя абстрактного синтаксиса типа идентификатор объекта АСН.1.
С.3.2 АСН.1 может использоваться как общий инструмент для спецификации значений данных представления и их объединения в поименованные абстрактные синтаксисы.
С.3.3 В простейшем случае такого использования имеется единственный тип АСН.1, такой, что каждое значение данных представления в поименованном абстрактном синтаксисе является значением этого типа АСН.1. Этот тип обычно является выборочным типом, а каждое значение данных представления будет альтернативой из этого выборочного типа. В данном случае рекомендуется, чтобы используемая нотация модуля АСН.1 содержала этот выборочный тип в качестве первого определяемого типа с последующими определениями (не универсальных) типов, которые прямо или косвенно указываются в этом выборочном типе.
Примечание - Сказанное не подразумевает исключение ссылок на типы, определенные в других модулях.
С.3.4 Рекомендуется, чтобы присваивание идентификатора и описателя объекта абстрактному синтаксису осуществлялось с использованием полезного класса информационных объектов ABSTRACT-SYNTAX, определенного в ГОСТ Р ИСО/МЭК 8824-2. Так же рекомендуется, чтобы все использования ABSTRACT-SYNTAX были сгруппированы в одном "корневом" модуле, идентифицирующем все абстрактные синтаксисы, используемые в прикладном стандарте.
С.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-descri ptor ObjectDescriptor : : = ".........."
- - Значения идентификатора и описателя объекта АСН.1:
- - идентификатор объекта правила кодирования,
- - описатель объекта правила кодирования,
- - присвоенные правилам кодирования в ИСО/МЭК 8825-1 и ИСО/МЭК 8825-2
- - могут использоваться как идентификатор синтаксиса передачи вместе с
- - настоящим абстрактным синтаксисом,
- - ISOxxxx-yyyy-Abstract-Syntax
END
С.3.6 Для того чтобы гарантировать взаимодействие, стандарт может дополнительно потребовать обязательной поддержки синтаксиса передачи, полученного применением правил кодирования, указанных в модуле абстрактного синтаксиса.
С.4 Подтипы
С.4.1 Подтипы используются для ограничения значений существующего типа, допустимых в конкретной ситуации.
Примеры
AtomicNumber : : = INTEGER (1..104) - - атомное число
TouchTonеString : : = 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)
- - малое простое число
С.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) ограничения подтипов не влияют на кодирование.
С.4.3 Когда два или более связанных типа имеют существенную общность, следует рассмотреть возможность явного определения этой общности как порождающего типа и введения подтипов для отдельных типов. Такой подход делает очевидными взаимосвязь и общность и продолжает их поддерживать для типов, имеющих отношение к делу. Тем самым обеспечивается возможность использования при реализации общего подхода к обработке значений этих типов.
Пример
Envelope : : = SET {
typeA TypeA,
typeB TypeB OPTIONAL,
typeC TypeC OPTIONAL }
- - общий порождающий тип
ABEnvelope : : = Envelope (WITH COMPONENTS
{...,
typeB PRESENT, typeC ABSENT })
- - typeB всегда должен присутствовать, typeС - отсутствовать
AСEnvelope : : = Envelope (WITH COMPONENTS
{...,
typeB ABSENT, typeC PRESENT })
- - typeC всегда должен присутствовать, typeB - отсутствовать
Два последних определения альтернативно могут быть записаны как:
AВEnvelope : : = Envelope (WITH COMPONENTS {typeA, type B})
ACEnvelope : : = Envelope (WITH COMPONENTS {typeA, type С})
Выбор между этими альтернативами мог бы быть сделан на основе таких факторов, как количество компонентов в порождающем типе, количество среди них факультативных, степень различия отдельных типов и, вероятно, стратегии развития.
С.4.4 Подтипы используются для частично определенных значений, например для протокольных блоков данных (ПБД), которые должны быть протестированы в тесте соответствия, когда тест направлен только на некоторые из компонентов ПБД.
Пример
Пусть определен ПБД
PDU : : = SET
{alpha INTЕGER,
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})
С.4.5 Если тип данных общего назначения был определен как SEQUENCE OF, то подтипы используются для определения ограниченных подтипов общего типа.
Пример
Text-block : : = SEQUENCE OF VisibleString
Address : : = Text-block (SIZE (1 .. 6)) (WITH COMPONENT (SIZE (1 .. 32)))
С.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' должны отсутствовать;
- - 'с', 'd' или 'е' могут присутствовать в значении
W : : = Z (WITH COMPONENTS {..., a PRESENT})
- - может присутствовать только 'а' (см. 48.8.9.2)
Х : : = Z (WITH COMPONENTS { a PRESENT})
- - может присутствовать только 'а' (см. 48.8.9.2)
Y : : = Z (WITH COMPONENTS {a ABSENT, b, c})
- - 'а', 'doe' и 'e' должны отсутствовать;
- - 'с' или 'b' могут присутствовать в значении
Примечание - W и Х семантически идентичны.
С.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)
Если вы являетесь пользователем интернет-версии системы ГАРАНТ, вы можете открыть этот документ прямо сейчас или запросить по Горячей линии в системе.