Пример.
Surname : : = PrintableString
Тип «строка октетов» следует использовать для представления любой строки информации, которая не может быть представлена с помощью одного из типов «строка знаков». Обязательно следует определить используемые знаки и способ их представления в виде октетов. *
Пример.
PackedBCDString : : = OCTET STRING
- цифры от 0 до 9, две цифры на октет,
- каждая цифра кодируется как 0000—1001,
- комбинация 1111 используется для
- дополнения до полного октета
Вырожденный тип
Вырожденный тип («NULL» следует использовать в том случае, когда требуется задать отсутствие элемента некоторой последовательности.
Пример.
Patientidentifier : : = SEQUENCE
{name VisibleString,
roomNumber CHOICE
{INTEGER,
NULL- - в случае выбывающего пациента- -}}
Примечание. Тот же результат может быть достигнут с помощью параметра «OPTIONAL».
Типы «последовательность» и «последовательность из»
Тип «последовательность из» следует использовать для
представления совокупности переменных одного и того же типа, количество которых велико или непредсказуемо, а порядок следования существенен.
Пример.
NamesOfMemberNations : : = SEQUENCE OF VisibleString
- - перечисление в порядке вступления
Тип «последовательность» следует использовать для представления совокупности переменных одного и того же типа, количество которых невелико и известно, порядок следования существенен, при условии, что состав ,совокупности не должен меняться при переходе к следующей версии протокола.
Пример.
NamesOfOffisers : : = SEQUENCE
{president VisibleString,
vicePresident VisibleString, secretary VisibleString}
Тип «последовательность» следует также использовать для представления совокупности переменных различных типов, количество которых невелико и известно, при условии, что состав совокупности не должен меняться при переходе к следующей версии протокола.
Пример.
C
VisibleString, VisibleString,
password
redentials : : = SEQUENCE {userName VisibleStaccountNumber INTEGER} •
Если в типе «последовательность» имеется фиксированное число элементов различных типов, то каждому элементу, чье назначение не очевидно из его типа, следует присвоить ссылочное имя.
Пример.
File : : = SEQUENCE
ContentType,
other FileAttributes,
content ANY }
См. также пп. 5.2.3.3, 5.2.3.4 и 5.2.5 Приложения 5.
Тип «множество»
Тип «множество» следует использовать для представления совокупности переменных, количество которых невелико и известно, а порядок следования несущественен. Каждой переменной следует присвоить метку контекстно зависимого класса.
Пример.
UserName : : = SET
personalName [0] IMPLICIT VisibleString, organisationName [1] IMPLICIT VisibleString, counteryName [2] IMPLICIT VisibleString}
Тип «множество» с включением параметра «OPTIONAL» следует использовать для представления совокупности переменных, которая является собственным или несобственным подмножеством другой совокупности переменных, причем количество переменных достаточно мало, а их порядок несущественен. Каждой переменной следует присвоить метку контекстнозависимого класса.
Пример.
UserName : : =SET
{personalName [0] IMPLICIT VisibleString
organisationName [1] IMPLICIT VisibleString OPTIONAL
- по умолчанию — название данной организации - -, countryName [2] IMPLICIT VisibleString OPTIONAL
- по умолчанию — название данной страны - -}
Тип «множество» следует также использовать для представления совокупности переменных, состав которой с большой вероятностью будет меняться при переходе к следующей версии протокола. Каждой переменной следует присвоить метку контекстнозависимого класса.
Пример.
UserName : : = SET
{personalName [0] IMPLICIT VisibleString, organisationName [1] IMPLICIT VisibleString OPTIONAL
- по умолчанию — название данной организации - -, countryName [2] IMPLICIT VisibleString OPTIONAL
- по умолчанию — название данной страны
- другие необязательные атрибуты оставлены для
- дальнейшей проработки - - }
Если количество элементов, входящих в тип «множество», фиксировано, то каждому элементу, чье назначение не очевидно из его типа, следует присвоить ссылочное имя.
Пример.
FileAttributes : : = SET
{owner [0] IMPLICIT UserName
sizeOfContentlnOctets [1 IMPLICIT INTEGER
[2] IMPLICIT AccessControls,
• • • }
Тип «множество» следует также использовать для представления совокупности переменных разных типов, порядок которых несущественен.
Пример.
Keywords : : = SET OF VisibleStringh
- - в произвольном порядке
См. также пп. 5.2.3.4 и 5.2.8.3 приложения 5.
Тегированный тип
В рамках настоящего стандарта тегированный тип универсального класса используется для определения широко используемых, не зависящих от конкретного применения типов данных, представление которых должно отличаться от представления всех других типов данных.
Пример. -
EncriptionKey : : = [UNIVERSAL 30] IMPLICIT OCTET
STRING
- - семь октетов
Тегированный тип прикладного класса следует использовать при определении типа данных, которые находят широкое, не локализованное использование в некотором контексте представления, причем представление этого типа должно отличаться от представления всех других типов данных в том же контексте представления.
Пример.
FileName : : = [APPLICATIONS] IMPLICIT SEQUENCE {directorName VisibleString,
DirectoryRelativeFileName VisibleString}
Контекстнозависимые тегированные типы используются для различения элементов множества. Если единственным требованием, предъявляемым к числовым тегам, является отличие их.
друг от друга, то их следует присваивать, начиная с нуля.
Пример. CustomerRecord : : |
= SET |
{name |
[0] IMPLICIT VisibleString, 16 |
mailingAddress accountNumber balanceDue |
[1] IMPLICIT VisibleString, [2] IMPLICIT VisibleString, [3] IMPLICIT VisibleString - - в центах - -} |
5.2.8.4. В тех случаях, когда некоторый элемент множества имеет тег прикладного класса (APPLICATION), то не требуется
присвоения нового контекстно зависимого тега, за исключением тех случаев, когда требуется (или может потребоваться в будущем) обеспечить его отличие от других элементов множества. В тех случаях, когда элемент множества имеет тег универсального класса (UNIVERSAL), ему следует дополнительно присвоить контекстнозависимый тег.
Пример.
ProductRecord : : = SET
{ UniformCode,
description [0] IMPLICIT INTEGER
,
inventoryNo [1] IMPLICIT INTEGER,
inventoryLevel [2] IMPLICIT INTEGER}
UniformCode : : = [APPLICATION 13] IMPLICIT INTEGER
Контекстно зависимые тегированные типы следует использовать также при определении вариантов выборочного типа (CHOICE). Если единственным требованием к тегам является их отличие друг от друга, то следует начинать с нулевого значения.
Пример.
CustomerAttribute : : = SET
{
mailingAddress accountNumber balanceDue
name [0] IMPLICIT VisibleString,[
[3] IMPLICIT INTEGER
1] IMPLICIT VisibleString,В тех случаях, когда некоторый вариант, входящий в ‘ определение выборочного типа (CHOICE), представляет собой тип, имеющий тег прикладного класса (APPLICATION), то не требуется использовать контекстно зависимый тег, за исключением тех случаев, когда нужно (или может понадобиться в будущем) различать между собой варианты выборочного типа.
Пример.
ProductDesignator : : = CHOICE
{ UniformCode,
description [0] IMPLICIT VisibleString,
inventoryNo [1] IMPLICIT INTEGER, }
UniformCode : : = [APPLICATION 13] IMPLICIT INTEGER 5.2.8.7. В тех случаях, когда некоторый вариант, входящий в определение выборочного типа (CHOICE), представляет собой тип, имеющий тег универсального класса (UNIVERSAL), необходимо использовать контекстно зависимый тег, за исключением тех случаев, когда ставится цель обеспечить выбор из нескольких, (более одного) разных универсальных типов.
Пример.
Customeridentifier : : — CHOICE
{name VisibleString,
number INTEGER }
Тегированный тип пользовательского класса следует использовать для определения данных, используемых в рамках некоторой организации или страны, причем требуется, чтобы была возможность отличить эти данные (по их представлению) от всех остальных данных, используемых этой организацией или страной.
Пример.
AcmeBadgeNumber : : = [PRIVATE 2] IMPLICIT INTEGER
В приводящихся здесь рекомендациях во всех примерах, где это допустимо, используется «неявное» задание тегов, то есть с указанием «IMPLICIT». При использовании соответствующих правил кодирования это приводит к компактному представлению данных, что весьма желательно в некоторых приложениях. В других приложениях компактность может быть менее важна, чем, например, возможность выполнения детальной проверки типов данных. В последнем случае может использоваться явное задание тегов.
См. также пп. 5.2.7.1, 5.2.7.2, 5.2.9.1 и 5.2.9.2 приложения 5.
Выборочный тип
Выборочный тип (CHOICE) следует использовать для представления переменной, выбираемой; из совокупности переменных, количество которых известно и невелико. Каждая переменная из упомянутой совокупности идентифицируется с помощью контекстно зависимого тега..
Пример.
Fileidentifier : : = CHOICE
{relativeName [0] IMPLICIT VisibleString,
- имя файла, например, «MarchProgressReport») absoluteName [1] IMPLICIT VisibleString,
- имя файла и содержащий это имя каталог
- (например, «<Williams>MarchProgressReport») serialNumber [2] IMPLICIT INTEGER
- идентификатор, присвоенный файлу системой - -}
5.2.Э.2. Выборочный тип (CHOICE) следует использовать также для представления переменной, выбираемой из совокупности переменных, состав которых с большой вероятностью будет меняться при переходе от одной версии протокола к следующей версии. Каждую переменную из упомянутой совокупности следует идентифицировать с помощью контекстно зависимого тега.
Пример.
Fileidentifier : : = CHOICE
{relativeName [0] IMPLICIT VisibleString,
- имя файла (например, «MarchProgressReport») absoluteName [1] IMPLICIT VisibleString,
- имя файла и содержащий это имя каталог
- (например, «<Williams>MarchProgressReport»)
- другие формы идентификаторов файлов оставлены
- для дальнейшего исследования - - }
5.2.9.3. Каждому элементу, чье назначение не очевидно из его типа, следует присвоить ссылочное имя.
Пример.
Fileidentifier : : =, CHOICE
{relativeName [0] IMPLICIT VisibleString,
- имя файла (например, «MarchProgressReport») absoluteName [1] IMPLICIT VisibleString,
имя файла и содержащий это имя каталог
- (например, «<Williams>MarchProgressReport») serialNumber [2] IMPLICIT INTEGER
- идентификатор, присвоенный файлу системой- -}
В тех случаях, когда в некотором конкретном применении настоящего стандарта нормой является неявное задание тегов (с указанием «IMPLICIT») и планируется переход от использования одного типа к использованию нескольких типов, рекомендуется использование выборочного типа (CHOICE), состоящего из одного варианта. Этим исключается возможность того, что будет иметь место неявное задание тегов, и таким образом облегчается переход к использованию нескольких типов.
Пример.
Greeting : : = [APPLICATION 12] CHOICE {VisibleString}
в будущем предполагается переход к
Greeting : : = [APPLICATION 12] CHOICE {VisibleString, Voise }
Селективный тип
Селективный тип следует использовать для представления переменной, тип которой является типом некоторого варианта в определенном ранее выборочном типе.
Пусть дано определение
FileAttribute : : = CHOICE
{date-last-used INTEGER,
file-name VisibleString}
тогда возможно следующее определение:
CurrentAttributes : : = SEQUENCE
{date-last-used < FileAttribute, file-name < FileAttribute}
с возможной записью значения
{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» } .
Произвольный тип
Произвольный (ANY) тип следует- использовать для представления переменной, тип которой не задан или задан в другом месте с помощью нотации АСН.1.
Пример.
MessageCbntents : : = ANY - - элемент данных, тип которого определен с помощью - - нотации АСН.1 за рамками настоящего стандарта 5.2.12. Внешний тип
5.2.12.1. Внешний (EXTERNAL) тип следует использовать для представления переменной, тип которой не задан или задан в другом месте без Ограничений на используемую для этого нотацию.
Пример.
FileContents : : = EXTERNAL
DocumentList : : = SEQUENCE OF EXTERNAL
Пример использования макронотации
Предположим, что желательно иметь обозначения для определения типа следующего вида:
PaiR TYPEX= ... TYPEY = ... , допускающие запись соответствующего значения в виде (X=----,Y=----), где .... и означают соответственно любой тип АСН.1 и соот
ветствующее значение.
Такие макрообозначения типа могли бы быть использованы для определения типов и значений, как показано ниже:
Т1 : : = PAIR TYPEX = INTEGER TYPEY = BOOLEAN
T2 : : = PAIR TYPEX = VisibleString TYPEY = Tl.
Тогда значение типа Tl может иметь вид: (Х=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)