Нотация управления кодированием (ECN) — это стандартизированный формальный язык, который является частью семейства международных стандартов Abstract Syntax Notation One (ASN.1). [1] ECN предназначен для использования вместе с ASN.1, и каждая спецификация ECN (согласованный набор определений кодирования) явно связана с конкретной спецификацией ASN.1 (согласованный набор определений типов).
Стандарт ECN опубликован как ITU-T , так и ISO и официально называется Рекомендация ITU-T X.692 | ISO/IEC 8825-3, Информационные технологии – Правила кодирования ASN.1: Спецификация нотации управления кодированием (ECN) . [2]
ECN поддерживает формальную спецификацию нестандартных правил кодирования для определений типов ASN.1 и предназначен для использования в тех случаях, когда необходимо использовать кодировки, отличающиеся от тех, которые предусмотрены стандартизированными правилами кодирования, такими как BER или PER.
Тип ASN.1 имеет набор абстрактных значений. Правила кодирования определяют представление этих абстрактных значений в виде серии битов. Существуют приложения, в которых требуются специальные кодировки, отличные от тех, которые можно получить с помощью любого из стандартных наборов правил кодирования ASN.1.
Вот несколько примеров возможных ситуаций, требующих меньших или больших отклонений от стандартных кодировок:
В приведенных выше случаях и во многих других подобных случаях совместное использование ASN.1 и ECN позволяет создать полную формальную спецификацию как абстрактного синтаксиса (схемы), так и кодировок. Затем кодировщики и декодеры могут быть автоматически сгенерированы из объединенных спецификаций. Это является существенным фактором в сокращении как объема работы, так и вероятности ошибок при создании совместимых систем. Еще одним существенным преимуществом ECN является возможность предоставления автоматической поддержки инструментов для тестирования. Эти преимущества доступны только с ASN.1, когда достаточно стандартизированных правил кодировки, но ECN обеспечивает эти преимущества в обстоятельствах, когда стандартизированных правил кодировки недостаточно.
Чтобы понять, как работает ECN, полезно сосредоточиться на четырех типах элементов языка ASN.1: встроенные типы (например, INTEGER
и UTF8String
), встроенные ключевые слова конструктора (например, SEQUENCE
, CHOICE
, SEQUENCE OF
, OPTIONAL
), определяемые пользователем простые типы (например, , ) и определяемые пользователем сложные типы (например, ). Есть и другие аспекты ASN.1, которые также отражены в ECN, но мы не будем обсуждать их здесь.Age ::= INTEGER(0..200)
Color ::= ENUMERATED { green, yellow, red }
Name ::= SEQUENCE { first UTF8String, middle UTF8String, last UTF8String }
Язык ECN также имеет встроенные типы, встроенные ключевые слова конструктора, определяемые пользователем простые типы и определяемые пользователем сложные типы. Эти элементы языка ECN похожи на элементы ASN.1, но их имена всегда начинаются с # . Официально они называются классами кодирования , но здесь мы будем называть их просто типами ECN и ключевыми словами конструктора ECN . Примерами типов ECN являются: #INTEGER
(встроенный), #UTF8String
(встроенный), #Age
(простой определяемый пользователем), #Name
(сложный определяемый пользователем). Примерами ключевых слов конструктора ECN являются: #SEQUENCE
, #CHOICE
, #SEQUENCE-OF
, и #OPTIONAL
(все встроенные).
В отличие от ASN.1, ECN позволяет пользователю языка определять синонимы ключевых слов конструктора ECN (например, #InterleavedSequence ::= #SEQUENCE
). Таким образом, в ECN существуют как определяемые пользователем ключевые слова конструктора ECN, так и встроенные ключевые слова конструктора ECN.
С точки зрения ECN, каждый пользовательский тип ASN.1, встречающийся в спецификации ASN.1, имеет скрытый тип ECN, неявно связанный с ним. Официально этот скрытый тип ECN называется неявно сгенерированной структурой кодирования , но здесь мы будем называть его просто скрытым типом ECN типа ASN.1. Скрытые типы ECN являются особым видом пользовательских типов ECN (их определение ECN автоматически генерируется из пользовательского типа ASN.1, а не предоставляется пользователем), но они ведут себя как другие пользовательские типы ECN.
Скрытый тип ECN типа ASN.1 почти идентичен исходному типу ASN.1 (но немного упрощен) и является отправной точкой для процесса кодирования, указанного в ECN, который в конечном итоге генерирует ряд битов, представляющих любое заданное значение исходного типа ASN.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 (например, #SEQUENCE
, #OPTIONAL
), встречающиеся в скрытом типе ECN, синонимами. В ECN есть несколько встроенных синонимов как для ключевых слов конструктора, так и для встроенных типов (например, #CONCATENATION
является синонимом #SEQUENCE
, #INT
является синонимом #INTEGER
), но пользователь языка может определить как пользовательские типы, так и пользовательские ключевые слова конструктора как синонимы других. Целью этапа раскрашивания является подготовка скрытого типа ECN для следующего этапа, который представляет собой кодирование его компонентов, в случае, если необходимо закодировать по-другому различные вхождения одного и того же типа ECN или различные вхождения одного и того же ключевого слова конструктора ECN, присутствующего в скрытом типе ECN. Например, сложный скрытый тип ECN может содержать два списка ( #SEQUENCE-OF
), но один список должен быть закодирован путем вставки поля счетчика перед первым элементом списка, а другой должен быть закодирован путем вставки завершающего шаблона после последнего элемента списка. Это можно сделать, например, заменив первое #SEQUENCE-OF
ключевое слово в скрытом типе ECN на , скажем, #CountBasedRepetition
, заменив второе #SEQUENCE-OF
ключевое слово на , скажем, #TerminatingPatternBasedRepetition
, и объявив эти два имени как определяемые пользователем синонимы ключевого слова конструктора ECN #SEQUENCE-OF
. После того, как эти два разных ключевых слова конструктора были включены в скрытый тип ECN, каждый из двух списков может быть закодирован с помощью другого объекта кодирования.
Вторым шагом процесса кодирования является применение объекта кодирования к скрытому типу ECN. Значение, которое должно быть закодировано, будет одним из возможных значений типа ASN.1, определенных в спецификации ASN.1, и процесс кодирования выберет скрытый тип ECN этого типа ASN.1 и применит к нему соответствующий объект кодирования.
Возможны дальнейшие шаги, состоящие в рекурсивном применении объектов кодирования, которые работают путем замены типа ECN (или его части) другим типом ECN.
В ECN существует несколько видов объектов кодирования. Некоторые объекты кодирования полностью определяют фактическое кодирование на уровне бит простых типов ECN и являются наиболее простыми для понимания. Другие применяются к ключевым словам конструктора ECN, а не к типам ECN, и определяют некоторые структурные аспекты кодирования сложного типа ECN (или его части), созданного ключевым словом конструктора ECN (но не определяют его полную кодировку). Другие работают, заменяя тип ECN (или его часть) другим типом ECN, который затем должен быть закодирован путем применения к нему другого объекта кодирования.
Ниже перечислены наиболее важные виды кодируемых объектов в ECN:
#
, которое не должно совпадать с именем любого скрытого типа ECN.#
, которое не должно совпадать с именем любого скрытого типа ECN.#SEQUENCE
объявленного типа #OPTIONAL
; эти объекты кодирования могут применяться только к типам ECN, которые являются необязательными компонентами типа #SEQUENCE
;#SEQUENCE-OF
); эти объекты кодирования могут применяться только к типам ECN, которые являются #SEQUENCE-OF
типами;#CHOICE
присутствует, и могут применяться только к типам ECN, которые являются #CHOICE
типами;#CHOICE
присутствует: