ASN.1 BER Метка обращения с номером 31 или выше

Я работаю над декодированием закодированных данных ASN.1 BER, и мне интересно, какой должна быть правильная обработка тега 31 (в частности) и выше. Я чувствую, что спецификация X.690 немного двусмысленна, и у меня нет примера каких-либо данных, у которых есть тег 31 или больше.

Рассматриваемый раздел - 8.1.2.4, в котором рассматриваются теги, большие или равные 31; в частности 8.1.2.4.1 с) который гласит:

c) биты с 5 по 1 должны быть закодированы как 11111.

Тогда 8.1.2.4.2, который говорит:

Последующие октеты должны кодировать номер тега следующим образом:

a) бит 8 каждого октета должен быть установлен в единицу, если только он не является последним октетом идентификатора октетов;

b) биты 7–1 первого последующего октета, за которыми следуют биты 7–1 второго последующего октета, за которыми поочередно следуют биты 7–1 каждого последующего октета, вплоть до последнего включенного октета в октете идентификатора и включающего его кодировать двоичное целое число без знака, равное номеру тега, с битом 7 первого последующего октета в качестве старшего значащего бита;

c) биты с 7 по 1 первого последующего октета не должны быть равны нулю.

Исходя из этого, как вы кодируете тег 31? Я думаю, что это означает, что, кроме указания того, что представлен тег 31 или более, биты с 5 по 1 первого октета должны игнорироваться, если речь идет о действительном номере тега, и что фактический номер тега кодируется в октете. 2 года, следуя правилам раздела 8.1.2.4.2. В этой схеме тег 31 будет:

. . . 1 1 1 1 1   0 0 0 1 1 1 1 1

Так; в первом октете биты с 5 по 1 устанавливаются в 1, но они не составляют часть номера тега. Биты с 5 по 1 второго октета также являются единицами, но на этот раз они представляют кодируемый номер тега.

Может ли кто-нибудь подтвердить правильность моей интерпретации, или следует считать биты с 5 по 1 первого октета частью номера тега, если тег>= 31?

2 ответа

Решение

Раздел 8.1.2.4.2 довольно прост. Если тег не помещается в 5-битный октет идентификатора, вы устанавливаете их в 11111, чтобы указать, что номер тега больше и будет закодирован в следующих октетах.

Ваша интерпретация ИМХО верна. Спецификация ITU-T X.690 (08/2015) имеет хорошую иллюстрацию тега больше 30 в разделе 8.1.2.4.3. Номер метки вычисляется из (на рисунке) 2nd octet в Last octet,

Вы можете поэкспериментировать с различными кодировками ASN.1 здесь.

Вот моя реализация кодирования тегов, которая, очевидно, хорошо работает со многими другими.

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