Запутался в 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.

Другие вопросы по тегам