Перейти в оглавлению раздела

Часть XIII

13.4. Структурированные типы


    Используя базовые типы и применяя небольшой набор способов построения, можно получать сложные типы. Способы можно применять в любой последовательности, повторно, многократно. Получаемые в результате типы называют структурированными. В ASN.1 определяется шесть способов структурирования: "последовательность" (SEQUENCE), "последовательность из" (SEQUENCE OF), "множество" (SET), "множество из" (SET OF), выборочный тип (CHOICE), селективный тип.

    Тип "последовательность" - это структурированный тип, определяемый ссылкой на фиксированный, упорядоченный список типов; каждое значение нового типа является упорядоченной последовательностью значений типов-компонентов, по одному на каждого из них.

    Пример:

    Credentials ::= SEQUENCE

    { userName VisibleString,

     password VisibleString,

     accountNumber INTEGER }

    -- тип VisibleString - один из определенных в ASN.1 для

    -- представления строк знаков

    Любой тип-компонент может быть помечен как `OPTIONAL` или `DEFAULT_Значение`. Первое означает, что данный тип-компонент является необязательным при задании значения структурированного типа "последовательность". Второе означает задание значения, которое будет использоваться по умолчанию при пропуске значения соответствующего типа-компонента.

    Тип "последовательность из" - это структурированный тип, определяемый ссылкой на один из существующих типов; каждое значение нового типа является упорядоченной последовательностью произвольной длины из значений существующего типа.

    Пример:

    NamesOfMemberNations ::= SEQUENCE OF VisibleString

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

    Тип "множество" - это структурированный тип, определяемый ссылкой на фиксированный неупорядоченный список типов; каждое значение нового типа является неупорядоченным списком значений типов-компонентов, по одному на каждого из них.

    Пример:

    UserName ::= SET

    { personalName [0] IMPLICIT VisibleString,

     organizationName [1] IMPLICIT VisibleString,

     countryName [2] IMPLICIT VisibleString }

    Все типы-компоненты должны иметь различные теги. В данном примере исходные типы для типов-компонентов одинаковы, поэтому применено явное тегирование посредством контекстно-зависимых тегов. IMPLICIT означает, что при кодировании теги исходных типов VisibleString передаваться не будут (т.к. все равно различить элементы UserName можно будет только по заданным явно тегам).

    Любой тип-компонент может быть помечен как `OPTIONAL`:

    HCSStudent ::= SET

    { personalName [0] IMPLICIT VisibleString,

     group [1] IMPLICIT ENUMERATED {

    primary(0), secondary(1), external(2) } OPTIONAL

    --основная, если отсутствует }

    Тип "множество из" - это структурированный тип, определяемый ссылкой на единственный существующий тип; каждое значение нового типа является неупорядоченным списком из значений существующего типа.

    Пример:

    Keywords ::= SET OF VisibleString

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

    Выборочный тип - это структурированный тип, определяемый указанием фиксированного неупорядоченного списка различных типов; каждое значение нового типа является значением одного из типов-компонентов.

    Пример:

    FileIndentifier ::= CHOICE

    { relativeName [0] IMPLICIT VisibleString,

     --имя файла (например, MarchProgressReport)

     absoluteName [1] IMPLICIT VisibleString,

     --имя файла и содержащий это имя каталог,

     --например, Williams/MarchProgressReport

    serialNumber [2] IMPLICIT INTEGER

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

    При рассмотрении простых типов был назван тип NULL. Можно показать пример использования этого типа:

    PatientIdentifier ::= SEQUENCE

     { name VisibleString,

     roomNumber CHOICE

     { INTEGER,

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

    --Примечание: тот же результат может быть достигнут с помощью

    --параметра `OPTIONAL`.

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

    Пример:

    FileAttribute ::= CHOICE

    { date-last-used INTEGER,

     file-name VisibleString }

    

    CurrentAttributes ::= SEQUENCE

    { date-last-used

     file-name

    Здесь применен селективный тип при определении типов-компонентов типа CurrentAttributes.

    Возможное значение CurrentAttributes:

    { date-last-used 27,

     file-name "PROGRAM" }



Предыдущая глава Оглавление Следующая глава