Пример кодирования значения действительного числа
С.1 Отправитель, обычно, проверяет свое машинное представление чисел с плавающей точкой для определения (независящих от значения) алгоритмов, которые должны использоваться для преобразования значений между этим представлением и октетами длины и содержимого в кодировании вещественного значения АСН.1. В настоящем приложении описаны шаги, которые должны быть сделаны в таком процессе, исходя из (искусственного) машинного представления мантиссы чисел с плавающей точкой, показанного на рисунке С.1.
Принято, что экспонента может быть легко получена в виде целого числа из машинного представления чисел с плавающей точкой.
Рисунок С.1 - Представление чисел с плавающей точкой
С.2 Октеты содержимого, которые должны быть созданы для отправки ненулевого значения с использованием двоичного кодирования (как определено в настоящем стандарте), суть:
1 Октеты для Октеты для
где (знак мантиссы) зависит от преобразуемого значения, - фиксированное значение (например, 10) для основания представления (в данном случае принято основание 16), - фиксированное значение , вычисленное, как описано в С.3, - фиксированная длина значения экспоненты, вычисленная, как описано в С.4. (В настоящем приложении не рассматривается случай, когда превышает три октета.)
С.3 Алгоритм будет передавать октеты 1-5 машинного представления как значение после установки битов 8-3 октета 1 и битов 4-1 октета 5 равными нулю. Принято, что подразумеваемая десятичная точка в машинном представлении находится между битами 2 и 1 октета 1. Это подразумеваемое положение может быть смещено к ближайшей точке после конца октета 5 путем уменьшения значения до преобразования. Во взятой в качестве примера системе можно смещать на четыре бита при уменьшении экспоненты на единицу (т.к. принято основание 16), так что уменьшение на 9 поместит подразумеваемую точку между битами 6 и 5 октета 6.
Следовательно, для правильного размещения точки в значением должно быть , умноженное на 2. (Подразумеваемое положение в - после бита 1 октета 5). Таким образом, получаем основные параметры:
=3 (так что =11),
декремент экспоненты равен 9.
С.4 Длина, необходимая для экспоненты, вычисляется через максимальное число октетов, необходимых для представления значений:
- избыток - декремент экспоненты;
- избыток - декремент экспоненты,
где и - минимальное и максимальное целые значения представления экспоненты, избыток - любое значение, которое нужно вычесть для получения правильного значения экспоненты, а декремент экспоненты вычислен в С.3. Пусть это вычисление дает длину 3 октета. Тогда равно 10. Примем также, что избыток равен нулю.
С.5 Алгоритм пересылки теперь такой:
а) передать поле октетов идентификатора объекта базовых правил кодирования с тегом АСН.1 для действительного типа;
б) проверить на равенство нулю и, если это так, передать поле длины базовых правил кодирования АСН.1 со значением 0 (нет октетов содержимого) и завершить алгоритм;
в) проверить и запомнить знак мантиссы;
г) передать поле длины базовых правил кодирования АСН.1 со значением 9, имеющее вид:
11101110, если отрицательное, или
10101110, если положительное;
д) создать и передать 4 октета экспоненты со значением
-9;
е) обнулить биты 8-3 октета 1 и биты 4-1 октета 5, а затем передать 5 октетов мантиссы.