ASN.1 REAL — BER декодирование

Мне было дано задание на предмет форматов декодирования ASN.1. Я передал что-то, сохраняющее структуру тега REAL, и я должен разобрать его и ввести тип double. Проблема в том, что очень мало информации в интернете. Число, которое мне нужно преобразовать в десятичную форму.

Вот пример:

first-man NUMBER ::=
{
numb 11.987
}

Результатом является число:

30098007 0231312E 393837

Сразу много вопросов, стандарт BER гласит:

A BER encoded "tag" is made up of several bit fields:

---------------------------------
| 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
---------------------------------
|Class  |P/C| Tag Number        |
---------------------------------

Если я знаю, что мне придет именно тип REAL, то зачем мне разбирать эту структуру, потому что она только выбирает тег. Ну, мы получили номер 30098007 0231312E 393837. И что? Какая часть меня может упасть, чтобы расшифровать обратно 11,987 , потому что я знаю, что это число с плавающей запятой. И вообще, есть ли в Microsoft какая-то структура для этой кодировки?

Или если я знаю, что мой номер в десятичной форме. Я просто использовал для декодирования строки? Например число 5.65 в виде NR2 = «+5.65»? Просто так?

-1

Решение

Распаковка вложенных блоков:

30 09     -- SEQUENCE, of length 9
80 07  -- [0], context-specific Tag 0 of length 7
02 31 31 2E 39 38 37 -- ?? "11.987"

Специфичный для контекста означает, что его значение должно быть известно из контекста. Например, я понятия не имею, что это значит, потому что у меня нет контекста для этого. Что касается этого байта 02 — это может быть что угодно.

Так что это не может быть декодировано без дополнительной информации. Откуда это?

2

Другие решения

Увидеть МСЭ-T X.690, §8.5, который описывает кодирование содержимого для типа REAL. На практике значение REAL используется редко.

Тони предоставил хорошую разбивку кодировки, которая является триадой длины тега-значения, но кодировкой 02 31 31 2E 39 38 37 мог бы использовать небольшое уточнение. Чтобы понять 02 префикс, мы должны проконсультироваться §8.5.6:

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

а) если бит 8 = 1, то применяется двоичное кодирование, указанное в 8.5.7;

b) если бит 8 = 0 и бит 7 = 0, то применяется десятичное кодирование, указанное в 8.5.8;

c) если бит 8 = 0 и бит 7 = 1, то либо «SpecialRealValue» (см. Рекомендацию МСЭ-Т X.680 | ИСО / МЭК 8824-1), либо значение минус ноль кодируется, как в 8.5.9) ,

0x02 является 0b00000010, так что (б) применяется здесь. 8.5.8 описывает три возможных формы, которые дополнительно определены в ISO 6093. Поскольку это стандарт ISO, вы не найдете его в свободном доступе. Я полагаю, что эти форматы — это все строки символов ASCII.

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector