Notacja kontroli kodowania
Encoding Control Notation (ECN) to znormalizowany język formalny, który jest częścią rodziny międzynarodowych standardów Abstract Syntax Notation One (ASN.1). ECN jest przeznaczony do użytku wraz z ASN.1, a każda specyfikacja ECN (spójny zestaw definicji kodowania) jest wyraźnie powiązana z konkretną specyfikacją ASN.1 (spójny zestaw definicji typów).
Standard ECN jest publikowany zarówno przez ITU-T , jak i ISO i nosi oficjalną nazwę ITU-T Recommendation X.692 | ISO / IEC 8825-3, Technologia informacyjna - zasady kodowania ASN.1: specyfikacja notacji kontrolnej kodowania (ECN) .
ECN obsługuje formalną specyfikację niestandardowych reguł kodowania dla definicji typu ASN.1 i jest przeznaczony do stosowania zawsze, gdy konieczne jest użycie kodowania innego niż zapewniane przez standardowe reguły kodowania, takie jak BER lub PER.
Zastosowania ECN
Typ ASN.1 ma zestaw wartości abstrakcyjnych. Reguły kodowania określają reprezentację tych abstrakcyjnych wartości jako serię bitów. Istnieją aplikacje, w których wymagane jest specjalne kodowanie, różniące się od tych, które można uzyskać za pomocą standardowych zestawów reguł kodowania ASN.1.
Oto kilka przykładów możliwych sytuacji, które wymagają mniejszych lub większych odchyleń od standardowego kodowania:
- protokół może wymagać wyjątkowo zwartego kodowania; mimo że reguły Unaligned Packed Encoding Rules (PER) są ogólnie dość zwarte, w niektórych przypadkach można osiągnąć większą zwartość, wykorzystując rozkład statystyczny wartości pewnych pól lub usuwając inne formy redundancji;
- protokół może wymagać, aby pewne części zakodowanej wiadomości były łatwo dostępne bez konieczności dekodowania całej wiadomości za pomocą, powiedzmy, pełnego dekodera PER; ogólnie rzecz biorąc, wskakiwanie do środka wiadomości zakodowanej w systemie PER i rozpoczynanie dekodowania od tego miejsca nie jest zalecaną praktyką, ale w niektórych przypadkach może to być konieczne lub przydatne; w takich przypadkach dostęp do poszczególnych części kodowania można ułatwić i zapewnić niezawodność, określając zmodyfikowaną wersję PER;
- istnieje kilka standardowych protokołów, które kodują swoje dane w formacie tag-length-value (TLV) podobnym do BER; można chcieć stworzyć formalną specyfikację ASN.1 dla jednego z tych protokołów i określić zmodyfikowaną wersję BER, która pasuje do formatu ad hoc TLV;
- istnieje wiele standardowych protokołów, które kodują swoje dane w formacie binarnym ad hoc (zwykle określanym w tabelach), który może znacznie różnić się od PER lub dowolnego innego zestawu reguł kodowania ASN.1; można chcieć utworzyć formalną specyfikację ASN.1 dla jednego z tych protokołów i określić kodowanie binarne, które pasuje do formatu ad hoc.
W powyższych przypadkach oraz w wielu innych podobnych przypadkach łączne wykorzystanie ASN.1 i ECN umożliwia stworzenie pełnej, formalnej specyfikacji zarówno abstrakcyjnej składni (schematu), jak i kodowań. Kodery i dekodery mogą być następnie automatycznie generowane na podstawie połączonych specyfikacji. Jest to istotny czynnik zmniejszający zarówno nakład pracy, jak i możliwość popełnienia błędów w tworzeniu systemów interoperacyjnych. Kolejną istotną zaletą ECN jest możliwość zapewnienia automatycznego wsparcia narzędziowego do testowania. Te zalety są dostępne tylko w ASN.1, gdy wystarczą standardowe reguły kodowania, ale ECN zapewnia te korzyści w okolicznościach, w których standardowe reguły kodowania nie są wystarczające.
Przegląd ECN
koncepcje
Aby zrozumieć, jak działa ECN, warto skupić się na czterech rodzajach elementów języka ASN.1: typach wbudowanych (np. INTEGER
i UTF8String
), wbudowanych słowach kluczowych konstruktora (np. SEQUENCE
, CHOICE
, SEQUENCE OF
, OPCJONALNIE
), typy proste zdefiniowane przez użytkownika (np. Age ::= INTEGER(0..200)
, Color ::= ENUMERATED { green, yellow, red }
) oraz typy złożone zdefiniowane przez użytkownika (np. Name ::= SEKWENCJA {pierwszy UTF8String, środkowy UTF8String, ostatni UTF8String}
). Istnieją inne aspekty ASN.1, które również znajdują odzwierciedlenie w ECN, ale nie będziemy ich tutaj omawiać.
Język ECN ma również wbudowane typy, wbudowane słowa kluczowe konstruktora, typy proste zdefiniowane przez użytkownika i typy złożone zdefiniowane przez użytkownika. Te elementy języka ECN są podobne do elementów języka ASN.1, ale ich nazwy zawsze zaczynają się od #
. Oficjalnie nazywa się je klasami kodowania , ale tutaj będziemy je po prostu nazywać typami ECN i słowami kluczowymi konstruktora ECN . Przykładami typów ECN są: #INTEGER
(wbudowany), #UTF8String
(wbudowany), #Age
(prosty zdefiniowany przez użytkownika), #Name
(złożony zdefiniowany przez użytkownika). Przykłady słów kluczowych konstruktora ECN to: #SEKWENCJA
, #WYBÓR
, #SEKWENCJA-OF
i #OPCJONALNE
(wszystkie wbudowane).
W przeciwieństwie do ASN.1, ECN pozwala użytkownikowi języka definiować synonimy słów kluczowych konstruktora ECN (np. #InterleavedSequence ::= #SEQUENCE
). Dlatego w ECN istnieją zdefiniowane przez użytkownika słowa kluczowe konstruktora ECN, jak również wbudowane słowa kluczowe konstruktora ECN.
Z punktu widzenia ECN, każdy zdefiniowany przez użytkownika typ ASN.1 występujący w specyfikacji ASN.1 ma niejawnie powiązany z nim ukryty typ ECN. Oficjalnie ten ukryty typ ECN nazywany jest niejawnie generowaną strukturą kodowania , ale tutaj będziemy go po prostu nazywać ukrytym typem ECN typu ASN.1. Ukryte typy ECN są specjalnym rodzajem typów ECN zdefiniowanych przez użytkownika (ich definicja ECN jest generowana automatycznie na podstawie typu ASN.1 zdefiniowanego przez użytkownika, a nie dostarczana przez użytkownika), ale zachowują się jak inne typy ECN zdefiniowane przez użytkownika.
Ukryty typ ECN typu ASN.1 jest prawie identyczny z oryginalnym typem ASN.1 (ale nieco uproszczony) i stanowi punkt wyjścia dla procesu kodowania określonego w ECN, który ostatecznie generuje serię bitów reprezentujących dowolną daną wartość oryginalnego typu ASN.1. Typ ASN.1 (ani żadna jego część) nie jest bezpośrednio przywoływalny w celu określenia kodowania w ECN, ale jego ukryty typ ECN już tak. Typy ECN i słowa kluczowe konstruktora ECN mogą być jawnie przywoływane w specyfikacji ECN i są kodowane przez zastosowanie reguł zawartych w specyfikacji ECN.
Z grubsza mówiąc, specyfikacja ECN robi dwie rzeczy: mówi, jak zmodyfikować ukryty typ ECN, aby utworzyć nowy ( kolorowy ; patrz poniżej) ukryty typ ECN, i mówi, w jaki sposób typ ECN (a także każdy z jego komponentów, jeśli jest typ złożony) ma być zakodowany. To ostatnie można zastosować rekurencyjnie, w tym sensie, że etap kodowania komponentu typu ECN może skutkować dalszą modyfikacją w miejscu pozostałej części typu ECN, która jest kodowana. Proces ten może przebiegać przez dowolną liczbę cykli, aż do całkowitego zakodowania ostatecznego typu ECN, czyli wygenerowania wszystkich bitów reprezentujących wartość oryginalnego typu ASN.1.
Na koniec wprowadzimy koncepcję kodowania obiektu . Jest to bardzo ważny element języka ECN i odnosi się do każdej indywidualnej reguły kodowania, która jest częścią specyfikacji ECN i jest stosowana do typu ECN lub słowa kluczowego konstruktora ECN, wbudowanego lub zdefiniowanego przez użytkownika, występującego w specyfikacji .
Mechanizmy
Pierwszym krokiem procesu kodowania jest automatyczne generowanie ukrytych typów ECN ze wszystkich typów ASN.1 występujących w specyfikacji ASN.1. Ukryte typy ECN odpowiadające złożonym, zdefiniowanym przez użytkownika typom ASN.1 mogą być modyfikowane przez mechanizm zwany kolorowaniem , który polega na zastąpieniu nazw typów niektórych ich składowych synonimami. Możliwe jest również zastąpienie słów kluczowych wbudowanego konstruktora ECN (np. #SEQUENCE
, #OPTIONAL
) występujących w ukrytym typie ECN synonimami. W ECN istnieje kilka wbudowanych synonimów zarówno dla słów kluczowych konstruktora, jak i typów wbudowanych (np. #CONCATENATION
jest synonimem #SEKWENCJA
, #INT
jest synonimem #INTEGER
), ale użytkownik języka może zdefiniować oba typy zdefiniowane przez użytkownika i słowa kluczowe konstruktora zdefiniowane przez użytkownika jako synonimy innych. Celem etapu kolorowania jest przygotowanie ukrytego typu ECN do następnego kroku, jakim jest zakodowanie jego składowych, na wypadek konieczności zakodowania w inny sposób różnych wystąpień tego samego typu ECN lub różnych wystąpień tego samego typu ECN Słowo kluczowe konstruktora ECN obecne w ukrytym typie ECN. Na przykład złożony ukryty typ ECN może zawierać dwie listy ( #SEKWENCJA-OF
), ale jedna lista ma być zakodowana przez wstawienie pola licznika przed pierwszym elementem listy, a druga przez wstawienie kończącego wzór po ostatnim elemencie listy. Można to zrobić na przykład, zastępując pierwsze #SEKWENCJA-OF
w ukrytym typie ECN powiedzmy #CountBasedRepetition
, zastępując drugie słowo kluczowe #SEKWENCJA-OF
powiedzmy #TerminatingPatternBasedRepetition
i deklarując te dwa nazwy jako zdefiniowane przez użytkownika synonimy słowa kluczowego konstruktora ECN #SEKWENCJA-OF
. Po umieszczeniu tych dwóch różnych słów kluczowych konstruktora w ukrytym typie ECN, każdą z dwóch list można zakodować za pomocą innego obiektu kodowania.
Drugim krokiem procesu kodowania jest zastosowanie obiektu kodującego do ukrytego typu ECN. Wartość do zakodowania będzie jedną z możliwych wartości typu ASN.1 zdefiniowanych w specyfikacji ASN.1, a proces kodowania wybierze ukryty typ ECN tego typu ASN.1 i zastosuje odpowiedni obiekt kodowania do To.
Mogą istnieć dalsze kroki polegające na rekurencyjnym zastosowaniu kodowania obiektów, które działają poprzez zastąpienie typu ECN (lub jego części) innym typem ECN.
W ECN istnieje kilka rodzajów obiektów kodujących. Niektóre obiekty kodowania całkowicie określają rzeczywiste kodowanie na poziomie bitów prostych typów ECN i są najłatwiejsze do zrozumienia. Inne odnoszą się raczej do słów kluczowych konstruktora ECN niż do typów ECN i określają niektóre aspekty strukturalne kodowania złożonego typu ECN (lub jego części) skonstruowanego przez słowo kluczowe konstruktora ECN (ale nie określają całego kodowania). Inne polegają na zastąpieniu typu ECN (lub jego części) innym typem ECN, który następnie musi zostać zakodowany przez zastosowanie do niego innego obiektu kodowania.
Poniżej wymieniono najważniejsze rodzaje kodowania obiektów w ECN:
- niektóre obiekty kodowania określają kodowanie na poziomie bitów typu ECN;
- Te obiekty kodowania mają zastosowanie głównie do prostych typów ECN i mają kilka parametrów określających kodowanie wartości na poziomie bitów, rozmiar kodowania, wszelkie poprzedzające lub końcowe dopełnienie, dowolne wyrównanie do granicy oktetu lub słowa, wszelkie odwrócenia bitów itp. niektóre
- obiekty kodowania określają, że typ ECN musi zostać zastąpiony typem ECN zdefiniowanym przez użytkownika, który zawiera poprzedni typ ECN jako jeden ze swoich składników;
- Typ zamiennika musi być określony w specyfikacji ECN, a nie w specyfikacji ASN.1. Zdefiniowany przez użytkownika typ ECN musi mieć nazwę zaczynającą się od
#
, która nie może być taka sama jak nazwa jakiegokolwiek ukrytego typu ECN.
- Typ zamiennika musi być określony w specyfikacji ECN, a nie w specyfikacji ASN.1. Zdefiniowany przez użytkownika typ ECN musi mieć nazwę zaczynającą się od
- niektóre obiekty kodujące określają, że typ ECN musi zostać zastąpiony typem ECN zdefiniowanym przez użytkownika, i określają, jak odwzorować każdą wartość pierwszego typu na wartość drugiego typu;
- Typ zamiennika musi być określony w specyfikacji ECN, a nie w specyfikacji ASN.1. Zdefiniowany przez użytkownika typ ECN musi mieć nazwę zaczynającą się od
#
, która nie może być taka sama jak nazwa jakiegokolwiek ukrytego typu ECN.
- Typ zamiennika musi być określony w specyfikacji ECN, a nie w specyfikacji ASN.1. Zdefiniowany przez użytkownika typ ECN musi mieć nazwę zaczynającą się od
- niektóre obiekty kodujące określają, jak reprezentować obecność lub brak komponentu typu
#SEKWENCJA
, który jest zadeklarowanyjako #OPCJONALNY
; te obiekty kodowania można zastosować tylko do typów ECN, które są opcjonalnymi składnikami typu#SEKWENCJA
;
- Oto kilka typowych sposobów, w jakie te obiekty kodujące mogą reprezentować obecność opcjonalnego komponentu:
- przez wykorzystanie pola (zwykle boolowskiego), którego wartość wskazuje na obecność lub brak komponentu opcjonalnego i które zostało wstawione do typu ECN przez inny obiekt kodujący zastosowany na wcześniejszym etapie;
- opierając się na określonym wzorcu bitowym, który występuje w pewnych precyzyjnych lokalizacjach bitowych w kodowaniu wszystkich możliwych wartości elementu opcjonalnego, ale nigdy nie występuje w kodowaniu żadnego z typów, które mogą wystąpić po elemencie opcjonalnym zgodnie ze specyfikacją ECN;
- opierając się na rozmiarze otaczającego kodowania, aby określić, czy kodowanie opcjonalnego komponentu zmieści się w pozostałej przestrzeni.
- Oto kilka typowych sposobów, w jakie te obiekty kodujące mogą reprezentować obecność opcjonalnego komponentu:
- niektóre obiekty kodujące określają, jak reprezentować liczbę elementów listy (
#SEKWENCJA-OF
); te obiekty kodowania można zastosować tylko do typów ECN, które są#SEKWENCJA-OF
;
- Oto kilka typowych sposobów, w jakie te obiekty kodujące mogą reprezentować długość listy:
- poprzez wykorzystanie pola zawierającego długość listy, które zostało wprowadzone do typu ECN przez inny zastosowany wcześniej obiekt kodujący;
- opierając się na określonym wzorcu bitowym, który występuje w pewnych precyzyjnych lokalizacjach bitowych w ramach kodowania wszystkich możliwych wartości powtarzającego się składnika listy, ale nigdy nie występuje w kodowaniu żadnego z typów, które mogą wystąpić po liście zgodnie z ECN specyfikacja;
- opierając się na rozmiarze otaczającego kodowania w celu określenia, ile wystąpień kodowania powtarzającego się komponentu zmieści się w pozostałej przestrzeni;
- wybierając ciąg bitów, który nie pasuje do kodowania żadnej wartości powtarzającego się składnika listy, i wstawiając ten ciąg bitów po ostatnim elemencie listy;
- wykorzystując pole (zwykle boolowskie) w obrębie powtarzalnego składnika, którego wartość wskazuje, czy ten element jest ostatnim elementem listy.
- Oto kilka typowych sposobów, w jakie te obiekty kodujące mogą reprezentować długość listy:
- niektóre obiekty kodowania określają, w jaki sposób wskazać, która z alternatyw typu
#CHOICE
jest obecna i mogą być stosowane tylko do typów ECN, które są typami#CHOICE ;
- Oto kilka typowych sposobów, w jakie te obiekty kodujące mogą wskazywać, która z alternatyw #
WYBÓR
jest obecna:- poprzez wykorzystanie pola zawierającego indeks alternatywy, które zostało dodane do typu ECN przez inny zastosowany wcześniej obiekt kodujący;
- opierając się na określonym wzorcu bitowym, który występuje w pewnych precyzyjnych lokalizacjach bitowych w ramach kodowania wszystkich możliwych wartości każdej alternatywy i jest inny dla każdej alternatywy.
- Oto kilka typowych sposobów, w jakie te obiekty kodujące mogą wskazywać, która z alternatyw #
- niektóre obiekty kodowania określają, że typ ECN ma być kodowany przez zastosowanie do niego standardowego zestawu reguł kodowania (np. PER).