Обозначение управления кодированием - Encoding Control Notation
В Нотация управления кодированием (ECN) это стандартизированный формальный язык, который является частью Первая абстрактная синтаксическая нотация (ASN.1) семейство международных стандартов.[1] ECN разработан для использования вместе с ASN.1, и каждая спецификация ECN (согласованный набор определений кодирования) явно связана с конкретной спецификацией ASN.1 (согласованный набор определений типов).
Стандарт ECN опубликован как ITU-T и ISO, и официально называется Рекомендация МСЭ-Т X.692 | ИСО / МЭК 8825-3, Информационные технологии - Правила кодирования ASN.1: Спецификация нотации управления кодированием (ECN).[2]
ECN поддерживает формальную спецификацию нестандартных правил кодирования для определений типов ASN.1 и предназначен для использования всякий раз, когда необходимо использовать кодировки, которые отличаются от тех, которые предусмотрены стандартизированными правилами кодирования, такими как BER или PER.
Использование ECN
Тип ASN.1 имеет набор абстрактных значений. Правила кодирования определяют представление этих абстрактных значений в виде серии битов. Существуют приложения, в которых требуются специальные кодировки, отличные от тех, которые можно получить с помощью любого из стандартных наборов правил кодирования ASN.1.
Вот несколько примеров возможных ситуаций, требующих меньших или больших отклонений от стандартных кодировок:
- протокол может потребовать чрезвычайно компактного кодирования; даже несмотря на то, что правила невыровненного упакованного кодирования (PER), как правило, довольно компактны, в некоторых случаях можно добиться дополнительной компактности, используя статистическое распределение значений определенных полей или удаляя другие формы избыточности;
- протокол может требовать, чтобы определенные части закодированного сообщения были легко доступны без необходимости декодировать все сообщение, скажем, с помощью полного декодера PER; как правило, переход в середину сообщения, закодированного с помощью PER, и начало декодирования с этого момента не рекомендуется, но в некоторых случаях это может быть необходимо или полезно; в таких случаях доступ к определенным частям кодирования можно облегчить и сделать надежным, указав измененную версию PER;
- есть несколько стандартных протоколов, которые кодируют свои данные в формате значения длины тега (TLV), аналогичном BER; можно создать формальную спецификацию ASN.1 для одного из этих протоколов и указать модифицированную версию BER, которая соответствует специальному формату TLV;
- существует множество стандартных протоколов, которые кодируют свои данные в специальном двоичном формате (обычно указываемом с помощью таблиц), который может значительно отличаться от PER или любого другого набора правил кодирования ASN.1; кто-то может захотеть создать формальную спецификацию ASN.1 для одного из этих протоколов и указать двоичную кодировку, которая соответствует специальному формату.
В вышеуказанных случаях и во многих других подобных случаях совместное использование ASN.1 и ECN позволяет создать полную формальную спецификацию как абстрактного синтаксиса (схемы), так и кодировок. Затем кодеры и декодеры могут быть автоматически сгенерированы из объединенных спецификаций. Это существенный фактор для сокращения объема работы и возможности ошибок при создании совместимых систем. Еще одно важное преимущество ECN - это возможность предоставлять автоматическую поддержку инструментов для тестирования. Эти преимущества доступны только с ASN.1, когда достаточно стандартизированных правил кодирования, но ECN предоставляет эти преимущества в обстоятельствах, когда стандартизованных правил кодирования недостаточно.
Обзор ECN
Концепции
Чтобы понять, как работает ECN, полезно сосредоточиться на четырех типах элементов языка ASN.1: встроенных типах (например, ЦЕЛОЕ
и UTF8String
), ключевые слова встроенного конструктора (например, ПОСЛЕДОВАТЕЛЬНОСТЬ
, ВЫБОР
, ПОСЛЕДОВАТЕЛЬНОСТЬ ИЗ
, НЕОБЯЗАТЕЛЬНЫЙ
), определяемые пользователем простые типы (например, Возраст :: = INTEGER (0..200)
, Color :: = ENUMERATED {зеленый, желтый, красный}
) и определяемые пользователем сложные типы (например, Name :: = SEQUENCE {первая UTF8String, средняя UTF8String, последняя UTF8String}
). Есть и другие аспекты ASN.1, которые также отражены в ECN, но мы не будем их здесь обсуждать.
В языке ECN также есть встроенные типы, ключевые слова встроенного конструктора, определяемые пользователем простые типы и определяемые пользователем сложные типы. Эти элементы языка ECN аналогичны элементам ASN.1, но их имена всегда начинаются с символа #
. Официально они называются классы кодирования но здесь мы будем их просто называть Типы ECN и Ключевые слова конструктора ECN. Примеры типов ECN: # INTEGER
(встроенный), # UTF8String
(встроенный), #Возраст
(простой пользовательский), #Имя
(сложный, определяемый пользователем). Примеры ключевых слов конструктора ECN: #ПОСЛЕДОВАТЕЛЬНОСТЬ
, #ВЫБОР
, #ПОСЛЕДОВАТЕЛЬНОСТЬ ИЗ
, и #НЕОБЯЗАТЕЛЬНЫЙ
(все встроено).
В отличие от ASN.1, ECN позволяет пользователю языка определять синонимы ключевых слов конструктора ECN (например, #InterleavedSequence :: = #SEQUENCE
). Следовательно, в ECN есть ключевые слова конструктора ECN, определяемые пользователем, а также ключевые слова встроенного конструктора ECN.
С точки зрения ECN, каждый определяемый пользователем тип ASN.1, встречающийся в спецификации ASN.1, имеет скрытый тип ECN, неявно связанный с ним. Официально этот скрытый тип ECN называется неявно сгенерированная структура кодирования но здесь мы будем просто называть это скрытый тип ECN типа АСН.1. Скрытые типы ECN - это особый вид определяемых пользователем типов ECN (их определение ECN автоматически генерируется из определенного пользователем типа ASN.1, а не предоставляется пользователем), но они ведут себя так же, как другие определяемые пользователем типы ECN.
Скрытый тип ECN типа ASN.1 почти идентичен исходному типу ASN.1 (но немного упрощен) и является отправной точкой для процесса кодирования, указанного в ECN, который в конечном итоге генерирует серию битов, представляющих любое заданное значение. оригинального типа АСН.1. На тип ASN.1 (или любую его часть) нельзя напрямую ссылаться с целью указания кодировки в ECN, но на его скрытый тип ECN можно. На типы ECN и ключевые слова конструктора ECN можно явно ссылаться в спецификации ECN, и они кодируются с применением правил, содержащихся в спецификации ECN.
Грубо говоря, спецификация ECN делает две вещи: она говорит, как изменить скрытый тип ECN для создания нового (цветной; см. ниже) скрытый тип ECN, и в нем говорится, как должен кодироваться тип ECN (а также каждый из его компонентов, если это сложный тип). Последний может применяться рекурсивно в том смысле, что этап кодирования для компонента типа ECN может привести к дальнейшей модификации на месте оставшейся части кодируемого типа ECN. Этот процесс может продолжаться через любое количество циклов, пока окончательный тип ECN не будет полностью закодирован, то есть не будут сгенерированы все биты, представляющие значение исходного типа ASN.1.
Наконец, мы вводим понятие объект кодирования. Это очень важный элемент языка ECN и относится к каждому отдельному правилу кодирования, которое является частью спецификации ECN и применяется к типу ECN или ключевому слову конструктора ECN, встроенному или определяемому пользователем, встречающемуся в спецификации. .
Механизмы
Первым шагом процесса кодирования является автоматическое создание скрытых типов ECN из всех типов ASN.1, представленных в спецификации ASN.1. Скрытые типы ECN, соответствующие сложным пользовательским типам ASN.1, могут быть изменены с помощью механизма, называемого раскраска, заключающийся в замене названий типов некоторых их компонентов синонимами. Также можно заменить ключевые слова встроенного конструктора ECN (например, #ПОСЛЕДОВАТЕЛЬНОСТЬ
, #НЕОБЯЗАТЕЛЬНЫЙ
), встречающиеся в скрытом типе ECN с синонимами. В ECN есть несколько встроенных синонимов как для ключевых слов конструктора, так и для встроенных типов (например, # СВЯЗЬ
является синонимом #ПОСЛЕДОВАТЕЛЬНОСТЬ
, #INT
является синонимом # INTEGER
), но пользователь языка может определять как определяемые пользователем типы, так и определяемые пользователем ключевые слова конструктора как синонимы других. Цель этапа раскраски - подготовить скрытый тип ECN к следующему этапу, который представляет собой кодирование его компонентов, на случай, если необходимо по-разному кодировать разные вхождения одного и того же типа ECN или разные вхождения одного и того же Ключевое слово конструктора ECN присутствует в скрытом типе ECN. Например, сложный скрытый тип ECN может содержать два списка (#ПОСЛЕДОВАТЕЛЬНОСТЬ ИЗ
), но один список должен быть закодирован путем вставки поля счетчика перед первым элементом списка, а другой должен быть закодирован путем вставки завершающего шаблона после последнего элемента списка. Это можно сделать, например, заменив первый #ПОСЛЕДОВАТЕЛЬНОСТЬ ИЗ
ключевое слово в скрытом типе ECN с, скажем, #CountBasedRepetition
, заменив второй #ПОСЛЕДОВАТЕЛЬНОСТЬ ИЗ
ключевое слово с, скажем, #TerminatingPatternBasedRepetition
, и объявив эти два имени как определяемые пользователем синонимы ключевого слова конструктора ECN #ПОСЛЕДОВАТЕЛЬНОСТЬ ИЗ
. После того, как эти два разных ключевых слова конструктора были включены в скрытый тип ECN, каждый из двух списков может быть закодирован с помощью другого объекта кодирования.
Второй шаг процесса кодирования - это применение объекта кодирования к скрытому типу ECN. Кодируемое значение будет одним из возможных значений типа ASN.1, определенного в спецификации ASN.1, и процесс кодирования выберет скрытый тип ECN этого типа ASN.1 и применит соответствующий объект кодирования к Это.
Могут быть дальнейшие шаги, состоящие в рекурсивном применении объектов кодирования, которые работают путем замены типа ECN (или его части) другим типом ECN.
В ECN есть несколько видов объектов кодирования. Некоторые объекты кодирования полностью определяют фактическое битовое кодирование простых типов ECN и являются наиболее простыми для понимания. Другие применяются к ключевым словам конструктора ECN, а не к типам ECN, и определяют некоторые структурные аспекты кодирования сложного типа ECN (или его части), созданного с помощью ключевого слова конструктора ECN (но не указывают его полную кодировку). Другие работают, заменяя тип ECN (или его часть) другим типом ECN, который затем должен быть закодирован путем применения к нему другого объекта кодирования.
Наиболее важные типы объектов кодирования в ECN перечислены ниже:
- некоторые объекты кодирования определяют кодирование на битовом уровне типа ECN;
- Эти объекты кодирования применяются в основном к простым типам ECN и имеют несколько параметров, определяющих битовое кодирование значения, размер кодирования, любое предшествующее или завершающее заполнение, любое выравнивание по границе октета или слова, любые инверсии битов и т. Д. .
- некоторые объекты кодирования указывают, что тип ECN должен быть заменен определяемым пользователем типом ECN, который содержит прежний тип ECN в качестве одного из своих компонентов;
- Тип замены должен быть указан в спецификации ECN, а не в спецификации ASN.1. Пользовательский тип ECN должен иметь имя, начинающееся с
#
, которое не должно совпадать с именем любого скрытого типа ECN.
- Тип замены должен быть указан в спецификации ECN, а не в спецификации ASN.1. Пользовательский тип ECN должен иметь имя, начинающееся с
- некоторые объекты кодирования указывают, что тип ECN должен быть заменен определяемым пользователем типом ECN, и указывают, как сопоставить каждое значение первого типа со значением второго типа;
- Тип замены должен быть указан в спецификации ECN, а не в спецификации ASN.1. Пользовательский тип ECN должен иметь имя, начинающееся с
#
, которое не должно совпадать с именем любого скрытого типа ECN.
- Тип замены должен быть указан в спецификации ECN, а не в спецификации ASN.1. Пользовательский тип ECN должен иметь имя, начинающееся с
- некоторые объекты кодирования определяют, как представлять наличие или отсутствие компонента
#ПОСЛЕДОВАТЕЛЬНОСТЬ
объявленный тип#НЕОБЯЗАТЕЛЬНЫЙ
; эти объекты кодирования могут применяться только к типам ECN, которые являются необязательными компонентами#ПОСЛЕДОВАТЕЛЬНОСТЬ
тип;
- Вот несколько типичных способов, которыми эти объекты кодирования могут отображать наличие необязательного компонента:
- за счет использования (обычно логического) поля, значение которого указывает на наличие или отсутствие необязательного компонента и которое было вставлено в тип ECN другим объектом кодирования, примененным на более раннем этапе;
- полагаясь на конкретный битовый шаблон, который встречается в определенных точных битовых местоположениях в кодировках всех возможных значений дополнительного компонента, но никогда не встречается в кодировках любого из типов, которые могут идти после дополнительного компонента в соответствии со спецификацией ECN;
- полагаясь на размер включающей кодировки, чтобы определить, поместится ли кодировка дополнительного компонента в оставшееся пространство.
- Вот несколько типичных способов, которыми эти объекты кодирования могут отображать наличие необязательного компонента:
- некоторые объекты кодирования определяют, как представлять количество элементов списка (
#ПОСЛЕДОВАТЕЛЬНОСТЬ ИЗ
); эти объекты кодирования могут применяться только к типам ECN, которые#ПОСЛЕДОВАТЕЛЬНОСТЬ ИЗ
типы;
- Вот несколько типичных способов, которыми эти объекты кодирования могут представлять длину списка:
- путем использования поля, содержащего длину списка, которое было вставлено в тип ECN другим объектом кодирования, примененным на более раннем этапе;
- опираясь на конкретный битовый шаблон, который встречается в определенных точных битовых местоположениях в кодировках всех возможных значений повторяющегося компонента списка, но никогда не встречается в кодировках любого из типов, которые могут идти после списка в соответствии с ECN Технические характеристики;
- полагаясь на размер включающей кодировки, чтобы определить, сколько экземпляров кодирования повторяющегося компонента поместится в оставшееся пространство;
- путем выбора битовой строки, которая не соответствует кодировке любого значения повторяющегося компонента списка, и вставки этой битовой строки после последнего элемента списка;
- с помощью (обычно логического) поля в повторяющемся компоненте, значение которого указывает, является ли этот элемент последним элементом списка.
- Вот несколько типичных способов, которыми эти объекты кодирования могут представлять длину списка:
- некоторые объекты кодирования указывают, как указать, какая из альтернатив
#ВЫБОР
type присутствует и может применяться только к типам ECN, которые#ВЫБОР
типы;
- Вот несколько типичных способов, которыми эти объекты кодирования могут указывать, какие из альтернатив
#ВЫБОР
настоящее:- с помощью поля, содержащего индекс альтернативы, которое было добавлено к типу ECN другим объектом кодирования, примененным на более раннем этапе;
- опираясь на конкретный битовый шаблон, который встречается в определенных точных битовых местоположениях в кодировках всех возможных значений каждой альтернативы и отличается для каждой альтернативы.
- Вот несколько типичных способов, которыми эти объекты кодирования могут указывать, какие из альтернатив
- некоторые объекты кодирования указывают, что тип ECN должен быть закодирован путем применения к нему стандартного набора правил кодирования (например, PER).
Рекомендации
- ^ «Рекомендация МСЭ-Т X.680 / ISO / IEC 8824-1». Получено 2008-08-28.
- ^ «Рекомендация МСЭ-Т X.692 / ISO / IEC 8825-3». Получено 2008-08-28.