Запутался в BER (основные правила кодирования)
Я пытаюсь изучить и понять BER (Основные правила кодирования).
Я использовал сайт http://asn1-playground.oss.com/ чтобы экспериментировать с различными объектами ASN.1 и кодировать их, используя BER.
Однако даже самые простые кодировки, кажется, смущают меня.
Давайте возьмем простую схему ASN.1:
World-Schema DEFINITIONS AUTOMATIC TAGS ::=
BEGIN
Human ::= SEQUENCE {
name UTF8String
}
END
Так что в основном это просто SEQUENCE
с одним полем типа UTF8String называется name
,
Пример значения, соответствующего этой последовательности, будет выглядеть примерно так:
{ "Bob" }
Итак, используя http://asn1-playground.oss.com/
Я создаю кодировку BER следующих данных:
some-guy Human ::=
{
name "Bob"
}
Я ожидал бы, что это произведет один объект последовательности, сопровождаемый единственным строковым объектом.
Что я получаю это:
30 05 80 03 42 6F 62
Теперь я понимаю некоторые из этой кодировки. Первый октет, 30
является идентификатором, который говорит нам, что SEQUENCE
тип является первым объектом. 30
является 00110000
в двоичном, что означает, что у нас есть class
из 0
ПК (примитивный / построенный) бит 1
(имеется в виду) и номер тега 10000
(16 в десятичном виде), что означает SEQUENCE
Все идет нормально. Следующее значение - ДЛИНА в байтах SEQUENCE
, который 05
,
Хорошо, все еще так хорошо.
Но тогда... я совершенно смущен следующим октетом 80
, Что это значит??? Я ожидал бы значение 00001100 (для тега № 12, что означает UTF8String.)
Байты, следующие за 80
довольно просты: 03
означает длину 3, а 42 6F 62
просто само значение UTF8String, "Bob"
2 ответа
80 - это контекстно-зависимый тег 0. Обратите внимание, что в начале модуля используется "АВТОМАТИЧЕСКИЕ ТЕГИ". Это указывает на то, что все типы SEQUENCE, SET и CHOICE будут иметь специфичные для контекста теги для своих компонентов, начиная с [0] и увеличиваясь на 1 для каждого последующего компонента. Таким образом, вам не нужно беспокоиться о конфликтах тегов при создании сообщений, особенно при работе с компонентами, которые являются НЕОБЯЗАТЕЛЬНЫМИ или имеют значение ПО УМОЛЧАНИЮ. Если вы измените "AUTOMATIC" на "EXPLICIT" (что я бы не рекомендовал), вы увидите [UNIVERSAL 12], который вы ожидали в кодировке.
Обратите внимание, что автоматические теги применяются только к тегам компонентов SEQUENCE, SET или CHOICE. Это не относится к компонентам верхнего уровня, поэтому вы увидели [UNIVERSAL 16] для ПОСЛЕДОВАТЕЛЬНОСТИ, а не увидели там также контекстно-зависимый тег.
80 указывает на специфический для контекста класс, примитив, тег номер 0. Это происходит потому, что вы указали среду AUTOMATIC TAGGING, которая автоматически присваивала тегу [0] имя поля в типе Human.