Мне было дано задание на предмет форматов декодирования 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»? Просто так?
Распаковка вложенных блоков:
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 — это может быть что угодно.
Так что это не может быть декодировано без дополнительной информации. Откуда это?
Увидеть МСЭ-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.