Пример.

Surname : : = PrintableString

  1. Тип «строка октетов» следует использовать для представ­ления любой строки информации, которая не может быть пред­ставлена с помощью одного из типов «строка знаков». Обязатель­но следует определить используемые знаки и способ их представ­ления в виде октетов. *

  • Пример.

PackedBCDString : : = OCTET STRING

  • - цифры от 0 до 9, две цифры на октет,

  • - каждая цифра кодируется как 0000—1001,

  • - комбинация 1111 используется для

  • - дополнения до полного октета

  1. Вырожденный тип

Вырожденный тип («NULL» следует использовать в том слу­чае, когда требуется задать отсутствие элемента некоторой пос­ледовательности.

Пример.

Patientidentifier : : = SEQUENCE

{name VisibleString,

roomNumber CHOICE

{INTEGER,

NULL- - в случае выбывающего пациента- -}}

Примечание. Тот же результат может быть достигнут с помощью па­раметра «OPTIONAL».

  1. Типы «последовательность» и «последовательность из»

    1. Тип «последовательность из» следует использовать для

    2. представления совокупности переменных одного и того же типа, количество которых велико или непредсказуемо, а порядок следо­вания существенен.

Пример.

NamesOfMemberNations : : = SEQUENCE OF VisibleString

- - перечисление в порядке вступления

  1. Тип «последовательность» следует использовать для представления совокупности переменных одного и того же типа, количество которых невелико и известно, порядок следования су­щественен, при условии, что состав ,совокупности не должен ме­няться при переходе к следующей версии протокола.

Пример.

NamesOfOffisers : : = SEQUENCE

{president VisibleString,

vicePresident VisibleString, secretary VisibleString}

  1. Тип «последовательность» следует также использовать для представления совокупности переменных различных типов, количество которых невелико и известно, при условии, что состав совокупности не должен меняться при переходе к следующей вер­сии протокола.

Пример.

C

VisibleString, VisibleString,

password

redentials : : = SEQUENCE {userName VisibleSt

accountNumber INTEGER} •

  1. Если в типе «последовательность» имеется фиксирован­ное число элементов различных типов, то каждому элементу, чье назначение не очевидно из его типа, следует присвоить ссылочное имя.

Пример.

File : : = SEQUENCE

ContentType,

other FileAttributes,

content ANY }

См. также пп. 5.2.3.3, 5.2.3.4 и 5.2.5 Приложения 5.

  1. Тип «множество»

    1. Тип «множество» следует использовать для представ­ления совокупности переменных, количество которых невелико и известно, а порядок следования несущественен. Каждой перемен­ной следует присвоить метку контекстно зависимого класса.

Пример.

UserName : : = SET

personalName [0] IMPLICIT VisibleString, organisationName [1] IMPLICIT VisibleString, counteryName [2] IMPLICIT VisibleString}

  1. Тип «множество» с включением параметра «OPTIO­NAL» следует использовать для представления совокупности пе­ременных, которая является собственным или несобственным подмножеством другой совокупности переменных, причем количес­тво переменных достаточно мало, а их порядок несущественен. Каждой переменной следует присвоить метку контекстнозависи­мого класса.

Пример.

UserName : : =SET

{personalName [0] IMPLICIT VisibleString

organisationName [1] IMPLICIT VisibleString OPTIONAL

  • - по умолчанию — название данной организации - -, countryName [2] IMPLICIT VisibleString OPTIONAL

  • - по умолчанию — название данной страны - -}

  1. Тип «множество» следует также использовать для пред­ставления совокупности переменных, состав которой с большой вероятностью будет меняться при переходе к следующей версии протокола. Каждой переменной следует присвоить метку контек­стнозависимого класса.

Пример.

UserName : : = SET

{personalName [0] IMPLICIT VisibleString, organisationName [1] IMPLICIT VisibleString OPTIONAL

  • - по умолчанию — название данной организации - -, countryName [2] IMPLICIT VisibleString OPTIONAL

  • - по умолчанию — название данной страны

  • - другие необязательные атрибуты оставлены для

  • - дальнейшей проработки - - }

  1. Если количество элементов, входящих в тип «множест­во», фиксировано, то каждому элементу, чье назначение не оче­видно из его типа, следует присвоить ссылочное имя.

Пример.

FileAttributes : : = SET

{owner [0] IMPLICIT UserName

sizeOfContentlnOctets [1 IMPLICIT INTEGER

[2] IMPLICIT AccessControls,

• • • }

  1. Тип «множество» следует также использовать для пред­ставления совокупности переменных разных типов, порядок кото­рых несущественен.

Пример.

Keywords : : = SET OF VisibleStringh

- - в произвольном порядке

См. также пп. 5.2.3.4 и 5.2.8.3 приложения 5.

  1. Тегированный тип

    1. В рамках настоящего стандарта тегированный тип уни­версального класса используется для определения широко исполь­зуемых, не зависящих от конкретного применения типов данных, представление которых должно отличаться от представления всех других типов данных.

Пример. -

EncriptionKey : : = [UNIVERSAL 30] IMPLICIT OCTET

STRING

- - семь октетов

  1. Тегированный тип прикладного класса следует исполь­зовать при определении типа данных, которые находят широкое, не локализованное использование в некотором контексте пред­ставления, причем представление этого типа должно отличаться от представления всех других типов данных в том же контексте представления.

Пример.

FileName : : = [APPLICATIONS] IMPLICIT SEQUENCE {directorName VisibleString,

DirectoryRelativeFileName VisibleString}

  1. Контекстнозависимые тегированные типы используются для различения элементов множества. Если единственным требо­ванием, предъявляемым к числовым тегам, является отличие их.

друг от друга, то их следует присваивать, начиная с нуля.

Пример.

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

  1. Контекстно зависимые тегированные типы следует ис­пользовать также при определении вариантов выборочного типа (CHOICE). Если единственным требованием к тегам является их отличие друг от друга, то следует начинать с нулевого значения.

Пример.

CustomerAttribute : : = SET

{

mailingAddress accountNumber balanceDue

name [0] IMPLICIT VisibleString,

[

[3] IMPLICIT INTEGER

1] IMPLICIT VisibleString,
[2] IMPLICIT INTEGER,
  1. В тех случаях, когда некоторый вариант, входящий в ‘ определение выборочного типа (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 }

  1. Тегированный тип пользовательского класса следует ис­пользовать для определения данных, используемых в рамках не­которой организации или страны, причем требуется, чтобы была возможность отличить эти данные (по их представлению) от всех остальных данных, используемых этой организацией или страной.

Пример.

AcmeBadgeNumber : : = [PRIVATE 2] IMPLICIT INTEGER

  1. В приводящихся здесь рекомендациях во всех приме­рах, где это допустимо, используется «неявное» задание тегов, то есть с указанием «IMPLICIT». При использовании соответствую­щих правил кодирования это приводит к компактному представ­лению данных, что весьма желательно в некоторых приложениях. В других приложениях компактность может быть менее важна, чем, например, возможность выполнения детальной проверки ти­пов данных. В последнем случае может использоваться явное за­дание тегов.

См. также пп. 5.2.7.1, 5.2.7.2, 5.2.9.1 и 5.2.9.2 приложения 5.

  1. Выборочный тип

  1. Выборочный тип (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

  • - идентификатор, присвоенный файлу системой- -}

  1. В тех случаях, когда в некотором конкретном приме­нении настоящего стандарта нормой является неявное задание те­гов (с указанием «IMPLICIT») и планируется переход от исполь­зования одного типа к использованию нескольких типов, рекомен­дуется использование выборочного типа (CHOICE), состоящего из одного варианта. Этим исключается возможность того, что будет иметь место неявное задание тегов, и таким образом облегчается переход к использованию нескольких типов.

Пример.

Greeting : : = [APPLICATION 12] CHOICE {VisibleString}

в будущем предполагается переход к

Greeting : : = [APPLICATION 12] CHOICE {VisibleString, Voise }

  1. Селективный тип

    1. Селективный тип следует использовать для представ­ления переменной, тип которой является типом некоторого вари­анта в определенном ранее выборочном типе.

    2. Пусть дано определение

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» } .

  1. Произвольный тип

    1. Произвольный (ANY) тип следует- использовать для представления переменной, тип которой не задан или задан в дру­гом месте с помощью нотации АСН.1.

Пример.

MessageCbntents : : = ANY - - элемент данных, тип которого определен с помощью - - нотации АСН.1 за рамками настоящего стандарта 5.2.12. Внешний тип

5.2.12.1. Внешний (EXTERNAL) тип следует использовать для представления переменной, тип которой не задан или задан в дру­гом месте без Ограничений на используемую для этого нотацию.

Пример.

FileContents : : = EXTERNAL

DocumentList : : = SEQUENCE OF EXTERNAL

  1. Пример использования макронотации

Предположим, что желательно иметь обозначения для опреде­ления типа следующего вида:

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)