Откройте актуальную версию документа прямо сейчас
Если вы являетесь пользователем интернет-версии системы ГАРАНТ, вы можете открыть этот документ прямо сейчас или запросить по Горячей линии в системе.
Приложение Е
Справочное
Примеры и рекомендации
В этом приложении приводятся примеры использования нотации АСН.1 для описания некоторых взятых произвольно структур данных. В нем также содержатся пояснения и рекомендации по использованию различных возможностей АСН.1.
Е.1 Пример записи учета кадров
В этом подразделе использование АСН.1 иллюстрируется на примере произвольно взятой простой записи учета кадров.
Е.1.1 Неформальное описание записи учета кадров
Ниже приводится структура записи учета кадров и ее значение для конкретного служащего.
Имя: |
John Р Smith |
Должность: |
Директор |
Учетный номер: |
51 |
Дата найма: |
17 сентября 1971 |
Имя супруги: |
Mary Т Smith |
Число детей: |
2 |
Информация о ребенке | |
Имя: |
Ralph Т Smith |
Дата рождения: |
11 ноября 1957 |
Информация о ребенке | |
Имя: |
Susan В. Tones |
Дата рождения: |
17 июня 1959 |
Е.1.2 Описание структуры записи с помощью АСН.1
Структура каждой записи учета кадров формально описана ниже с помощью стандартных обозначений для типов данных.
PersonnelRecord : : = [APPLICATION 0] IMPLICIT SET | |
{ |
Name, |
title |
[0] VisibleString, |
number |
EmployeeNumber, |
dateOfHire |
[1] Date, |
nameOfSpouse |
[2] Name, |
children |
[3] IMPLICIT SEQUENCE OF |
|
Childlnformation DEFAULT { } } |
ChildInformation : : = SET | |
{ |
Name |
dateOfBirth |
[0] Date} |
Name : : = [APPLICATION 1] IMPLICIT SEQUENCE | |
{givenName |
VisibleString, |
initial |
VisibleString, |
familyName |
VisibleString} |
EmpIoyeeNumber : : = [APPLICATION 2] IMPLICIT INTEGER
Date : : = [APPLICATION 3] IMPLICIT VisibleString - YYYYMMDD
В этом примере иллюстрируется один из аспектов синтаксического разбора выражений АСН.1. Синтаксическая конструкция "по умолчанию" ("DEFAULT") может применяться только к элементам выражения "последовательность" ("SEQUENCE") или "множество" ("SET"), но не может быть применена к элементам "последовательность из" ("SEQUENCE OF"). Поэтому выражение "DEFAULT { }" в "записи учета кадров" ("PersonnelRecord") относится к выражению "дети" ("children"), а не к выражению информация о ребенке" ("Childlnformation").
Е.1.3 Описание значения записи с помощью АСН.1
Значение записи учета кадров для описанного в начале подраздела, служащего в стандартных обозначениях для значений данных, будет иметь вид:
{ {givenName "John", initial "Р", familyName "Smith"}, | |
title "Director" |
, |
number 51 |
, |
dateOfHire "19710917" |
, |
nameOfSpouse {givenName "Mary", initial "T", familyName "Smith"}, | |
children |
|
{ { {givenName "Ralph", initial "T", familyName "Smith"}, | |
dateOfBirth "19571111"}, |
|
{ {givenName "Susan", initial "B", familyName "Jones"}, | |
dateOfBirth "19590717"}} } |
E.2 Рекомендации по использованию нотации
Типы данных и формальная нотация, определенные в настоящем стандарте,, обладают большой гибкостью, предоставляя возможность их использования в широком спектре протоколов. Эта гибкость, однако, может привести к недоразумениям, в особенности при недостаточном опыте ее использования. В этом приложении делается попытка свести к минимуму возможность недоразумений c помощью рекомендаций по использованию нотации и примеров ее использования. Для каждого из встроенных типов данных предлагается одна или несколько рекомендаций по использованию. Типы "строка знаков" (например, "отображаемая строка" ("VisibleString") и типы, определенные в разделах 32-35, здесь не рассматривают.
Е.2.1 Булевский тип
Е.2.1.1 Булевский тип следует использовать для представления значений логических переменных (то есть имеющих два разных состояния), например, ответа на вопрос "да" или "нет".
Пример
Employed : : = BOOLEAN
Е.2.1.2 При назначении ссылочного имени булевскому типу следует использовать слово, подходящее для обозначения состояния "истина".
Пример
Married : : = BOOLEAN
а не
MaritalStatus : : = BOOLEAN
См. также Е.2.3.2.
Е.2.2 Целочисленный тип
E.2.2.1 Целочисленный тип следует использовать для представления значений количественных числительных и целочисленных переменных для всех практических целей, без ограничения величины.
Пример
CheckiagAccountBalance : : = INTEGER
- - значение выражено в центах; отрицательное
- - значение означает перерасход
Е.2.2,2 Следует определять допустимые максимальное и минимальное значении целочисленного типа в качестве выделенных значений.
Пример
DayOfTheMonth : : = INTEGER {first(1), last(31)}
E.2.3 Перечислительный тип
E.2.3.1 Перечислительный тип с выделенными значениями следует использовать для представления значений переменной с тремя или более состояниями. Если единственным требованием к значениям переменной является их отличие друг от друга, то значения следует присваивать, начиная с нуля.
Пример
DayOfTheWeek : := |
ENUMERATED |
{sunday (0), monday (1), tuesday (2), |
wednesday (3), thursday (4), friday (5), | ||
saturday (6)} |
E.2.3.2 Перечислительный тип следует использовать для представления значений переменной, которая имеет только два состояния, но у которой могут появиться дополнительные состояния в следующей версии протокола.
Пример
Следует использовать описание
MaritalStatus : : = ENUMERATED {single (0), married (1)}
если предполагается его последующая замена на следующее:
MaritalStatus : : = ENUMERATED {single (0), married (1), widowed (2)}
E.2.4 Тип "действительное число"
E.2.4.1 Тип "действительное число" следует использовать для представления приближенных значений.
Пример
AngleInRadians : : = REAL
pi REAL : : = {3141592653589793238462643383279, 10, -30}
E.2.5 Тип "строка битов"
Е.2.5.1 Тип "строка битов" следует использовать для представления двоичных данных, формат и длина которых не заданы или заданы в другом месте, при этом длина данных в битах необязательно кратна восьми.
Пример
G3FacsimilePage : : = BIT STRING
- - последовательность битов, удовлетворяющая
- - рекомендации МККТТ Т.4.
Е.2.5.2 Следует определять первый и последний имеющие смысл биты строки фиксированной длины в качестве выделенных битов.
Пример
Nibble : : = BIT STRING {first (0), last (3)}
E.2.5.3 Тип "строка битов" следует использовать также для представления значений битового отображения, то есть упорядоченной совокупности логических переменных, показывающих, выполняется или нет некоторое определенное условие для каждого объекта из некоторой упорядоченной совокупности.
Пример
SunnyDaysOfTheMonth : : = BIT STRING {first (1), last (31)}
- - 1-й день - солнечный в том и только
- - в том случае, если i-й бит равен единице
Е.2.5.4 Тип "строка битов" с поименованными значениями следует использовать для представления значений совокупности взаимосвязанных логических переменных.
Пример
PersonalStatus : : = BIT STRING
{married (0), employed (1), veteran (2), collegeGraduate (3)}
Е.2.6 Тип "строка октетов"
Е.2.6.1 Тип "строка октетов" следует использовать для представления значений двоичных данных, формат и длина которых не заданы или заданы в другом месте, причем длина данных в битах кратна восьми.
Пример
G4FacsimileImage : : = OCTET STRING
- - последовательность октетов,
- - удовлетворяющая рекомендациям
- - МККТТ Т.5 и Т.6
Е.2.6.2 В случаях, когда доступен для использования требуемый тип "строка знаков", его использование следует предпочесть использованию типа "строка октетов".
Пример
Surname : : = PrintableString
Е.2.6.3 Тип "строка октетов" следует использовать для представления любой строки информации, которая не может быть представлена с помощью одного из типов "строка знаков". Обязательно следует определить используемые знаки и способ их представления в виде октетов.
Пример
PackedBCDString : : = OCTET STRING
- - цифры от 0 до 9 - две цифры на октет,
- - каждая цифра кодируется как 0000-1001,
- - комбинация 1111 используется для дополнения до полного октета
Е.2.7 Вырожденный тип
Вырожденный тип ("NULL") следует использовать в том случае, когда требуется задать отсутствие элемента некоторой последовательности.
Пример
PatientIdentifier : : SEQUENCE
{name VisibleString,
roomNumber CHOICE
{INTEGER,
NULL - - в случае выбывающего пациента - - }}
Примечание. Тот же результат может быть достигнут с помощью параметра "OPTIONAL".
Е.2.8 Типы "последовательность" и "последовательность из"
Е.2.8.1 Тип "последовательность из" следует использовать для представления совокупности переменных одного и того же типа, количество которых велико или непредсказуемо, а порядок следования существенен.
Пример
NamesOfMemberNations : : = SEQUENCE OF VisibleString
- - перечисление в порядке вступления
Е.2.8.2 Тип "последовательность" следует использовать для представления совокупности переменных одного и того же типа, количество которых невелико и известно, порядок следования существенен, при условии, что состав совокупности не должен меняться при переходе к следующей версии протокола.
Пример
NamesOfOffisers : : = SEQUENCE
{president VisibleString,
vicePresident VisibleString,
secretary VisibleString}
Е.2.8.3 Тип "последовательность" следует также использовать для представления совокупности переменных различных типов, количество которых невелико и известно, при условии, что состав совокупности не должен меняться при переходе к следующей версии протокола.
Пример
Credentials : : = SEQUENCE
{userName VisibleString,
password VisibleString,
accountNumber INTEGER}
E.2.8.4 Если в типе "последовательность" имеется фиксированное число элементов различных типов, то каждому элементу, чье назначение неочевидно из его типа, следует присвоить ссылочное имя.
Пример
File : : = SEQUENCE
{ContentType,
other FileAttributes,
content ANY }
См. также E.2.3.3, Е.2.3.4 и E.2.5
E.2.9 Тип "множество"
E.2.9.1 Тип "множество" следует использовать для представления совокупности переменных, количество которых невелико и известно, а порядок следования несущественен. Каждой переменной следует присвоить метку контекстно зависимого класса.
Пример
UserName : : = SET |
|
personalName |
[0] IMPLICIT VisibleString |
organisationName |
[1] IMPLICIT VisibleString, |
countryName |
[2] IMPLICIT VisibleString} |
E.2.9.2 Тип "множество" с включением параметра "OPTIONAL" следует использовать для представления совокупности переменных, которая является собственным или несобственным подмножеством другой совокупности переменных, причем количество переменных достаточно мало, а их порядок несущественен. Каждой переменной следует присвоить метку контекстно зависимого класса.
Пример
UserName : : = SET |
|
{personalName |
[0] IMPLICIT VesibieString, |
organisationName |
[1] IMPLICIT VisibleString |
|
OPTIONAL |
- - по умолчанию - название данной организации - -, | |
countryName |
[2] IMPLICIT VisibleString |
|
OPTIONAL |
- - по умолчанию - название данной страны - - } |
Е.2.9.3 Тип "множество" следует также использовать для представления совокупности переменных, состав которой с большой вероятностью будет меняться при переходе к следующей версии протокола. Каждой переменной следует присвоить метку контекстно зависимого класса.
Пример
UserName : : = SET |
|
|
{personalName |
[0] IMPLICIT VisibleString, |
|
organisationName |
[1] IMPLICIT VisibleString |
|
|
OPTIONAL |
|
- - по умолчанию - название данной организации - - | ||
countryName [2] IMPLICIT VisibleString OPTIONAL | ||
- - по умолчанию - название данной страны - - другие необязательные атрибуты оставлены для - - дальнейшей проработки - - |
} |
Е.2.9.4 Если количество элементов, входящих в тип "множество", фиксировано, то каждому элементу, чье назначение неочевидно из его типа, следует присвоить ссылочное имя.
Пример
FileAttributes : : = SET |
|
|
{owner |
[0] IMPLICIT UserName, |
|
sizeOfContentInOctets |
[1] IMPLICIT INTEGER, |
|
|
[2] IMPLICIT AccessControls, |
|
|
|
Е.2.10 Тегированный тип
Е.2.10.1 В рамках настоящего стандарта тегированный тип универсального класса используют для определения широко используемых, не зависящих от конкретного применения типов данных, представление которых должно отличаться от представления всех других типов данных.
Пример
EncriptionKey : = [UNIVERSAL 30] IMPLICIT OCTET STRING
- - семь октетов
E.2.10.2 Тегированный тип прикладного класса следует использовать при определении типа данных, которые находят широкое, не локализованное использование в некотором контексте представления, причем представление этого типа должно отличаться от представления всех других типов данных в том же контексте представления.
Пример
FileName : : = [APPLICATION 8] |
IMPLICIT SEQUENCE |
|
{directoryName |
VisibleString, |
|
DirectoryRelativeFileName |
VisibleString} |
E.2.10.3 Контекстно зависимые тегированные типы используют для различения элементов множества. Если единственным требованием, предъявляемым к числовым тегам, является отличие их друг от друга, то их следует присваивать, начиная с нуля.
Пример
CustomerRecоrd : : = SET |
|
|
{name |
[0] IMPLICIT VisibleString, |
|
mailingAddress |
[1] IMPLICIT VisibleString, |
|
accountNumber |
[2] IMPLICIT VisibleString, |
|
balanceDue |
[3] IMPLICIT VisibleString |
|
|
- - в центах - -} |
|
E.2.10.4 В случаях, когда некоторый элемент множества имеет тег прикладного класса (APPLICATION), то не требуется присвоения нового контекстно зависимого тега, за исключением случаев, когда требуется (или может потребоваться в будущем) обеспечить его отличие от других элементов множества. В случаях, когда элемент множества имеет тег универсального класса (UNIVERSAL), ему следует дополнительно присвоить контекстно зависимый тег.
Пример
ProductRecord = SET |
|
{ |
UniformCode |
description |
[0] IMPLICIT INTEGER, |
inventoryNo |
[1] IMPLICIT INTEGER, |
inventoryLevel |
[2] IMPLICIT INTEGER} |
UniformCode = [APPLICATION 13] |
IMPLICIT INTEGER |
E.2.10.5 Контекстно зависимые тегированные типы следует использовать также при определении вариантов выборочного типа (CHOICE). Если единственным требованием к тегам является их отличие друг от друга, то следует начинать с нулевого значения.
Пример
CustomerAttribute = SET |
|
|
{name |
[0] IMPLICIT VisibleString, |
|
mailingAddress |
[1] IMPLICIT VistbleSting, |
|
accountNumber |
[2] IMPLICIT INTEGER, |
|
balanceDue |
[3] IMPLICIT INTEGER |
|
|
- - в центах - -} |
|
E.2.10.6 В случаях, когда некоторый вариант, входящий в определение выборочного типа (CHOICE), представляет собой тип, имеющий тег прикладного класса (APPLICATION), то не требуется использовать контекстно зависимый тег, за исключением случаев, когда нужно (или может понадобиться в будущем) различать между собой варианты выборочного типа.
Пример
ProductDesignator = CHOICE |
|
{ |
UniformCode |
description |
[0] IMPLICIT VisibleString, |
inventoryNo |
[1] IMPLICIT INTEGER, } |
UniformCode = [APPLICATION 13] |
IMPLICIT INTEGER |
E.2.10.7 В случаях, когда некоторый вариант, входящий в определение выборочного типа (CHOICE), представляет собой тип, имеющий тег универсального класса (UNIVERSAL), необходимо использовать контекстно зависимый тег, за исключением случаев, когда ставится цель обеспечить выбор из нескольких (более одного) разных универсальных типов.
Пример
CustomerIdentifier = CHOICE
{name VisibleString,
INTEGER }
E.2.10.8 Тегированный тип пользовательского класса следует использовать для определения данных, используемых в рамках некоторой организации или страны, причем требуется, чтобы была возможность отличить эти данные (по их представлению) от всех остальных данных, используемых организацией или страной
Пример
AcmeBadgeNumber = [PRIVATE 2] IMPLICIT INTEGER
E.2.10.9 В приводящихся здесь рекомендациях во всех примерах, где это допустимо, используют "неявное" задание тегов, то есть с указанием "IMPLICIT" При использовании соответствующих правил кодирования это приводит к компактному представлению данных, что весьма желательно в некоторых приложениях. В других приложениях компактность может быть менее важна, чем, например, возможность выполнения детальной проверки типов данных. В последнем случае может использоваться явное задание тегов
Е.2.11 Выборочный тип
Е.2.11.1 Выборочный тип (CHOICE) следует использовать для представления переменной, выбираемой из совокупности переменных, количество которых известно и невелико. Каждая переменная из упомянутой совокупности идентифицируется с помощью контекстно зависимого тега.
Пример
FileIdentifier : : = CHOICE
{relativeName [0] IMPLICIT VisibleString,
- - имя файла (например, "MarchProgressReport")
absoluteName [1] IMPLICIT VisibleString,
- - имя файла и содержащий это имя каталог
- - (например, "<Williams>MarchProgressReport")
serialNumber. [2] IMPLICIT INTEGER
- - идентификатор, присвоенный файлу системой - -}
Е.2.11.2 Выборочный тип (CHOICE) следует использовать также для представления переменной, выбираемой из совокупности переменных, состав которых с большой вероятностью будет меняться при переходе от одной версии протокола к следующей версии. Каждую переменную из упомянутой совокупности следует идентифицировать с помощью контекстно зависимого тега.
Пример
FileIdentifier : : = CHOICE
{relativeName [0] IMPLICIT VisibleString,
- - имя файла (например, "MarchProgressReport")
absoluteName [1] IMPLICIT VisibleString,
- - имя файла и содержащий это имя каталог
- - (например, "<Williams>MarchProgressReport")
- - другие формы идентификаторов файлов оставлены
- - для дальнейшего исследования - - }
Е.2.11.3 Каждому элементу, чье назначение неочевидно из его типа, следует присвоить ссылочное имя.
Пример
FileIdentifier : : = CHOICE
{relativeName [0] IMPLICIT VisibleString,
- - имя файла (например, "MarchProgressReport")
absoluteName [1] IMPLICIT VisibleString,
- - имя файла и содержащий это имя каталог
- - например, "<Williams>MarchProgressReport")
serialNumber [2] IMPLICIT INTEGER
- - идентификатор, присвоенный файлу системой - -}
Е.2.11.4 В случаях, когда в некотором конкретном применении настоящего стандарта нормой является неявное задание тегов (то есть с указанием "IMPLICIT") и планируется переход от использования одного типа к использованию нескольких типов, рекомендуется использование выборочного типа (CHOICE), состоящего из одного варианта. Этим исключается возможность того, что будет иметь место неявное задание тегов, и таким образом облегчается переход к использованию нескольких типов.
Пример
Greeting : : = |
[APPLICATION 12] CHOICE |
|
{VisibleString} |
в будущем предполагается переход к | |
Greeting : : = |
[APPLICATION 12] CHOICE |
|
{VisibleString, |
|
Voice } |
E.2.12 Селективный тип
E.2.12.1 Селективный тип следует использовать для представления переменной, тип которой является типом некоторого варианта в определенном ранее выборочном типе.
Е.2.12.2 Пусть дано определение
FileAttribute : : = CHOICE
{date-last-used INTEGER,
file-name VisibleString}
тогда возможно следующее определение:
CurrentAttributes : : = SEQUENCE
{date-last-used<FileAttribute,
file-name<FileAttribute}
c возможной записью значения
{date-last-used 27,
file-name "PROGRAM"}
Возможно также следующее определение:
AttributeList : : = SEQUENCE
{first-attribute date-last-used<FileAttribute,
second-attribute file-name<FileAttribute,
с возможной записью значения
(first-attribute 27,
second-attribute "PROGRAM"}
E.2.13 Произвольный тип
E.2.13.1 Произвольный (ANY) тип следует использовать для представления переменной, тип которой не задан или задан в другом месте с помощью нотации АСН.1.
Пример
MessageContents : : = ANY
- - элемент данных, тип которого определен с помощью
- - нотации АСН.1 за рамками настоящего стандарта
Е.2.14 Внешний тип
Е.2.14.1 Внешний (EXTERNAL) тип следует использовать для представления переменной, тип которой не задан или задан в другом месте без ограничений на используемую для этого нотацию
Пример
FileContents : : = EXTERNAL
DocumentList : : = SEQUENCE OF EXTERNAL
E.3 Пример использования макронотации
Предположим, что желательно иметь обозначения для определения типа следующего вида:
PAIR TYPEX = ... TYPEY = ...
допускающие запись соответствующего значения в виде
(X = - - - -, Y = - - - -)
где ... и - - - - означают, соответственно, любой тип АСН.1 и соответствующее значение.
Такие макрообозначения типа могли бы быть использованы для определения типов и значений, как показано ниже:
T1 : : = PAIR |
TYPEX = INTEGER |
|
TYPEY = BOOLEAN |
T2 : : = PAIR |
TYPEX = VisibleString |
|
TYPEY = T1 |
Тогда значение типа T1 может иметь вид:
(Х = 3, Y = TRUE)
а значение типа Т2 может иметь вид:
(X = "Name", Y = (Х = 4, Y = FALSE))
Для обеспечения этих обозначений, которые могут рассматриваться как расширение базовой нотации АСН.1, может быть использовано следующее макроопределение:
PAIR MACRO : : = BEGIN TYPE NOTATION : : = | |||
|
"TYPEX" |
||
|
"=" |
||
|
type (Local-type-1) |
||
|
|
- - Здесь ожидается описание любого типа |
|
|
|
- - АСН.1, которое будет присвоено |
|
|
|
- - переменной Local-type-1; |
|
|
"TYPEY" |
||
|
"=" |
||
|
type (Local-type-2) |
||
|
|
- - Здесь ожидается описание второго типа |
|
|
|
- - АСН.1, которое будет присвоено |
|
|
|
- - переменной Local-type-2; |
|
VALUE NOTATION : : = | |||
|
"(" |
||
|
"Х" |
||
|
"=" |
||
|
value (Local-value-1 Local-type-1) |
||
|
|
- - Здесь ожидается описание значения типа, |
|
|
|
- - определяемого переменной Local-type-1, |
|
|
|
- - которое будет присвоено переменной |
|
|
|
- - Local-value-1; |
|
|
"," |
||
|
"Y" |
||
|
"=" |
||
|
value (Local-value-2 Local-type-2) |
||
|
|
- - Здесь ожидается описание значения типа, |
|
|
|
- - определяемого переменной Local-type-2, |
|
|
|
- - которое будет присвоено переменной |
|
|
|
- - Locai-value-2; |
|
|
<VALUE SEQUENCE {Local-type-1, |
||
|
|
|
Local-type-2} |
|
:: = {Local-value-1, Local-value-2}> |
||
|
|
- - Это "вложенное определение" возвращает |
|
|
|
- - окончательное значение, являющееся |
|
|
|
- - значением последовательности, |
|
|
|
- - состоящей из двух типов. |
|
|
")" |
||
END |
В этом примере тип возвращаемого значения (в смысле базовой нотации АСН.1) не зависит от подставляемого значения, но зависит от подставляемого типа. В других случаях тип может либо полностью определяться макроопределением, либо может зависеть от подставляемого значения. Отметим, тем не менее, что во всех случаях для определения типа возвращаемого значения следует рассматривать продукцию "VALUE NOTATION". Продукция "TYPE NOTATION" просто определяет синтаксис для определения типа и устанавливает начальные значения локальных переменных, используемых при анализе подставляемой нотации значения.
Е.4 Использование нотации для определения абстрактных синтаксисов
Е.4.1 Для использования услуг уровня представления (ГОСТ 34.971) требуется описание значений, называемых значениями данных уровня представления, и группирование этих значений в множества, называемые абстрактными синтаксисами. Каждому из этих множеств присваивается имя абстрактного синтаксиса, относящееся к определенному в АСН.1 типу "идентификатор объекта".
Е.4.2 Нотация АСН.1 может быть использована в качестве единого средства при описании значений данных уровня представления и их группировании в поименованные абстрактные синтаксисы.
Е.4.3 Для простейших случаев такого использования в нотации АСН.1 может найтись единственный тип, такой, что все значения данных представления, составляющие поименованный абстрактный синтаксис, будут значениями этого типа. Как правило, этим типом является выборочный тип, и все значения данных представления будут относиться к различным типам-вариантам из этого выборочного типа. В этом случае рекомендуется оформить определяемые данные в виде модуля, в котором первым определяемым типом будет вышеупомянутый выборочный тип, а далее будут приведены определения тех (неуниверсальных) типов, на которые имеются прямые или косвенные ссылки в определении выборочного типа.
Примечание. Это не означает, что исключаются ссылки на типы, определенные в других модулях.
Е.4.4 Ниже приведен пример текста, который мог бы быть частью некоторого стандарта, относящегося к прикладному уровню. Для исключения неоднозначности конец примера явно выделен строкой "Конец примера".
Пример
ISOxxxx-уууу DEFINITIONS : : =
BEGIN
PDU : : = CHOICE
{connect-pdu ...,
data-pdu CHOICE
{...
...}
...},
...
END
Настоящий стандарт присваивает следующее значение АСН.1 - идентификатор объекта
{iso standard хххх abstract-syntax (1)}
в качестве имени абстрактного синтаксиса для множества значений данных представления, каждое из которых является значением типа данных АСН.1 "ISOxxxx-yyyy.PDU". Соответствующим описателем объекта АСН.1 устанавливается
"..."
В качестве имени синтаксиса передачи, используемым вместе с определенным выше именем абстрактного синтаксиса, могут использоваться значения АСН.1 для идентификатора объекта и описателя объекта.
{joint-iso-ccitt asnl (1) basic-encoding (1)}
и
"Basic Encoding of a single ASN.1 type"
(присваиваемые информационному объекту в ГОСТ 34.974.
Конец примера
Е.4.5 Стандарт может также потребовать для этого абстрактного синтаксиса обязательной поддержки синтаксиса передачи, получаемого применением правил кодирования
{joint-iso-ccitt asn1 (1) basic-encoding (1)}
Е.5 Подтипы
Е.5.1 Подтипы следует использовать для ограничения значений существующего типа множеством значений, допустимых к конкретной ситуации.
Примеры
AtomicNumber : : = |
INTEGER (1. .104) |
TouchToneString : : = |
IA5String (FROM ("0" "1" "2" "3" "4" "5" |
|
"6" "7" "8" "9" "*" "#")) "SIZE (1. .63)) |
ParameterList : : = |
SET SIZE (0. .63) OF Parameter |
SmallPrime : : = |
INTEGER (2 3 5 7 11 13 17 19 23 29) |
E.5.2 В случаях, когда два или более типа имеют много общего, следует рассмотреть возможность явного определения в качестве исходного типа их общего порождающего типа и использовать механизм образования подтипов для определения требуемых типов. Этот подход подчеркивает взаимосвязь и общность типов и является привлекательным (хотя и необязательным) подходом к развитию типов. Такой подход облегчает, таким образом, реализацию обработки значений этих типов.
Пример
Envelope : : = SET {typeA TypeA, | |
|
typeB TypeB OPTIONAL, |
|
typeC TypeC OPTIONAL} |
|
- - общий порождающий тип |
ABEnvelope : : = Envelope (WITH COMPONENTS | |
|
{..., |
|
typeB PRESENT, typeC ABSENT}) |
|
- - где тип typeB должен всегда - - присутствовать, а тип typeC - - должен отсутствовать |
| |
| |
ACEnvelopt : : = Envelope (WITH COMPONENTS | |
|
{..., |
|
typeB ABSENT, typeC PRESENT}) |
|
- - где тип typeC должен всегда - - присутствовать, а тип typeB - - должен отсутствовать |
|
Два последних определения могут быть также записаны в следующем виде:
ABEnvelope : : = Envelope (WITH COMPONENTS{typeA, typeB})
ACEnvelope : : = Envelope (WITH COMPONENTS{typeA, typeC})
Выбор между альтернативными вариантами описания должен основываться на таких факторах, как число компонентов в порождающем типе, число необязательных компонентов, значительность различий между отдельными типами, а также вероятность их совместной дальнейшей эволюции.
Е.5.3 Механизм подтипов следует использовать для частичного определения значения, например, протокольного блока данных, с которым будет производиться сравнение в тесте конформности, при условии, что этот тест конформности анализирует только некоторые компоненты ПБД.
Пример
Пусть задан протокольный блок данных
PDU : : = SET |
|
|
{alpha [0] INTEGER, |
|
beta [1] IA5String OPTIONAL, |
|
gamma [2] SEQUENCE OF Parameter, |
|
delta [3] BOOLEAN} |
и необходимо составить тест, требующий, чтобы булевское значение было "ложно", а целочисленное значение было отрицательным. Тогда может быть использовано описание
TestPDU :: = PDU |
(WITH COMPONENTS |
|
{..., |
|
delta (FALSE), |
|
alpha (MIN ... < 0)}) |
Если к тому же требуется, чтобы значение типа-компонента IA5String, beta, обязательно присутствовало и имело длину либо 5, либо 12 знаков, может быть использовано описание:
FutherTestPdu : : = |
TestPDU (WITH COMPONENTS |
|
{..., |
|
beta (SIZE(5 12)) PRESENT}) |
E.5.4 Если тип данных общего назначения был определен как SEQUENCE OF, следует использовать механизм образования подтипов для определения подтипа, являющегося частым случаем общего типа.
Пример
Text-block : : = SEQUENCE OF VisibleString
Addres : : = Text-block (SIZE (1. .6) : WITH COMPONENT (SIZE (1. .32)))
E.5.5 Для образования новых подтипов из существующих подтипов следует использовать вложенные подтипы.
Пример
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 |
( |
|
INCLUDES First-quarter |
|
NCLUDES Second-quarter) |
Second-half : : = Months |
( |
|
INCLUDES Third-quarter |
|
INCLUDES Fourth-quarter) |
Если вы являетесь пользователем интернет-версии системы ГАРАНТ, вы можете открыть этот документ прямо сейчас или запросить по Горячей линии в системе.