Как мне следует интерпретировать стандарт ASN.1 BER для REAL? - PullRequest
5 голосов
/ 12 февраля 2011

Я читал

  • X.690 "Информационные технологии - правила кодирования ASN.1: спецификация базовых правил кодирования (BER), канонических правил кодирования (CER) и отличительных правил кодирования (DER)) "

В частности, §8.5.6.4 (d), касающийся двоичного кодирования значений REAL с мантиссой и показателем переменной длины, гласит:

«если биты со 2 по 1 равны 11, , то второй октет содержимого кодирует количество октетов, X скажем, (как двоичное число без знака) , используемое для кодирования значенияэкспоненты и третьего до ( X плюс 3) th (включительно) октеты содержимого кодируют значение показателя степени в виде двоичного числа, дополняющего двоичное число ; значение X должно быть не менее одного ; первые девять битов переданного показателя не должны быть всеми нулями или всеми. "

Этопротиворечиво, как октеты от "третьего до (X плюс 3) [rd]"на самом деле X + 1 октет.

Кто-нибудь может уточнить этот раздел?

Я предполагаю, что он должен читать либо

"... затем второй октет содержимого кодирует на единицу меньше количество октетов, X скажем, ... "

или

"... третий до (X плюс 2) и (включительно) октетов содержимого ..."

И, является минимальным значением X действительно 1 или 0 означает 1 октет?

ADDENDUM : Если кто-нибудь может предоставить мне некоторые данные испытаний по-разному BER-кодированные значения (строки октетов с их значениями), которые были бы полезны.

То, что у меня есть, это

  • 09 00 = 0 (ноль)
  • 0901 40 = + INF (бесконечность)
  • 09 01 41 = -INF
  • 09 08 03 2b 31 2e 30 65 2b 30 = "+ 1.0e + 0" = 1,0 (точное десятичное число)
  • 09 05 80 fe 55 55 55 = 1398101.25 (двоичный файл, 0x555555 * 2 ^ -2)

Пример, в котором я не уверене:

  • ?09 06 83 00 fc 00 00 01 = 0,0625 (двоичный, 0x000001 * 2 ^ -4)?

Кроме того, похоже, что для NaN не определена кодировка (не число).

Ответы [ 2 ]

2 голосов
/ 22 апреля 2011

Я думаю, что это просто вопрос индексации.

Октет содержимого # 1 содержит некоторые элементы (тип кодирования, бит знака, основание, коэффициент масштабирования и формат экспоненты).

Если формат экспоненты равен '11', то следующий октет (Октет содержимого # 2) содержит число X, которое представляет количество октетов, используемых для кодирования значения экспоненты. Третий октет содержимого содержит часть значения показателя. Последний октет содержимого равен x + 3.

CO1 (материал) CO2 (x) CO3 (показатель степени) ... CO [x + 3]

Минимальное значение для x равно 1. Если x = 1, то CO [x + 3] = CO4, что означает, что минимальное количество октетов содержимого для значения экспоненты равно двум. Самое короткое представление этой формы

CO1 CO2 CO3 CO4

Это будет означать, что '09 00 'не является допустимой кодировкой раздела 8.5.6. Как '09 01 04 'и '09 01 41'.

PLUS-INFINITY и MINUS-INFINITY кодируются с помощью правил раздела 8.5.8, что несовместимо с правилами раздела 8.5.6.

кодирование нуля по правилам раздела 8.5.6 выглядит следующим образом

CO1:8  =  1      (Content Octet #1 bit 8)
CO1:7  =  x =  0 (Content Octet #1 bit 7 is dont care, but I'll use 0 for positive)
CO1:65 = 00      (Content Octet #1 bits 6 and 5 is 00 for base two)
CO1:43 =  x = 01 (Content Octet #1 bits 4 and 3 is scaling factor, so we don't care but I'll make it 01 for a value of one)
CO1:21 = 11      (Content Octet #1 bits 2 and 1 is the exponent format and '11' is the format in question)

т. Октет содержимого # 1 = 1000 0111 равен 0x87

Октет содержимого # 2 = 0x01 (поскольку наименьшее значение X равно 1)

Октет содержимого № 3 = 0x00

Октет содержимого # 4 = 0x01

Октеты содержимого № 3 и № 4 дают показатель степени 1

(ноль * один) ^ один = ноль

0 голосов
/ 09 июля 2013

NaN определяется в 8.5.9 рядом с бесконечностью и будет 09 01 42

Это

09 06 83 00 fc 00 00 01 = 0,0625 (двоичный файл, 0x000001 * 2 ^ -4)

в соответствии с 8.5.7.4 d) недействительно, CO2 (X) "должен быть по крайней мере один".Но я также получаю ваш результат, когда игнорирую эти ограничения.

Лучше: 09 03 80 fc 01 = 0,0625 (двоичный файл, 0x01 * 2 ^ -4)

...