ГОСТ Р ИСО/МЭК 8825-2-200312 Кодирование целочисленного типа
Примечания
1 (Вариант ALIGNED) Диапазоны, которые допускают кодирование всех значений в одном октете или менее, попадают в битовое поле минимального размера без счетчика длины. Диапазоны, которые допускают кодирование всех значений в двух октетах, попадают в выровненное по октету битовое поле без счетчика длины. В остальных случаях значение кодируется в минимальном количестве октетов (используя неотрицательное двоичное целое или двоично-дополнительное до 2 целое кодирование) и добавляется детерминант длины. В том случае, когда целочисленное значение может быть закодировано менее чем в 127 октетов (как смещение от некоторой нижней границы, которая может быть определена) и нет конечных верхней и нижней границ, имеется одинооктетный детерминант длины; иначе длина кодируется в наименьшем необходимом количестве битов. Прочие случаи не имеют практического значения, но специфицированы для полноты.
2 (вариант UNALIGNED) Ограниченные целые кодируются в наименьшем необходимом для представления диапазона количестве битов независимо от их размера. Неограниченные целые числа кодируются, как в примечании 1.
12.1 Если в спецификации ограничения целочисленного типа присутствует маркер расширения, то к списку полей в битовом поле длины должен быть добавлен один бит. Бит должен быть равен 1, если значение, которое должно кодироваться, не находится в пределах диапазона корня расширения, и нулю — в противном случае. В первом случае значение должно быть добавлено к списку полей как неограниченное целое значение, как определено в 12.2.4—12.2.6, и процедура завершается. Во втором случае значение должно быть закодировано так, как если бы маркер расширения отсутствовал.
12.2 Если маркер расширения не представлен в спецификации ограничения целочисленного типа, тогда применяется следующая процедура.
12.2.1 Если видимые для PER ограничения допускают для целого единственное значение, то не должно быть никакого дополнения к списку полей, и эта процедура завершается.
12.2.2 Если видимые для PER ограничения допускают ограниченное целое число в качестве целочисленного значения, то оно должно быть преобразовано в поле согласно процедурам 10.5 (кодирование ограниченного целого числа), а затем должны быть применены процедуры 12.2.5—12.2.6.
12.2.3 Если видимые для PER ограничения допускают полуограниченное целое число в качестве целочисленного значения, то оно должно быть преобразовано в поле согласно процедурам 10.7 (кодирование полуограниченного целого числа), а затем должны быть применены процедуры 12.2.6.
12.2.4 Если видимые для PER ограничения допускают целое не только как ограниченное или полуограниченное целое число, то оно должно быть преобразовано в поле согласно процедурам 10.8 (кодирование неограниченного целого числа), а затем должны быть применены процедуры 12.2.6.
12.2.5 Если процедуры, использованные для кодирования целочисленного значения в поле, не привели к случаю неопределенной длины (см. 10.5.7.4 и 10.8.2), то это поле должно быть добавлено в конец списка полей, и эта процедура завершается.
12.2.6 В противном случае (т. е. в случае неопределенной длины) должны быть применены процедуры 10.9 для добавления поля в список полей после одного из следующих элементов:
а) ограниченного детерминанта длины 1еп (как определено 10.5.7.4), если видимое для PER ограничение удерживает тип в пределах верхней и нижней границ и (если тип расширяемый) значение находится в диапазоне корня расширения. Нижняя граница 1Ь, используемая в детерминанте длины, должна быть равна 1, а верхняя граница ub должна быть счетчиком количества октетов, требуемых для хранения диапазона целочисленного значения.
Примечание — Значение «foo INTEGER (256..1234567) :: = 256» было бы закодировано как ООххххххОООООООО, где каждый ’х’ представляет нулевой заполняющий бит, который может присутствовать или отсутствовать в зависимости от того, в каком месте в октете находится длина (например, ОО хххххх ОООООООО, если длина начинается на границе октета, и ОО ОООООООО, если она начинается во втором от конца бите октета);
б) неограниченного детерминанта длины 1еп (как определено в 10.7 и 10.8), если видимые для PER ограничения не удерживают тип в пределах верхней и нижней границ или если тип расширяемый и значение не находится в диапазоне корня расширения.
13 Кодирование перечислимого типа
Примечание — Перечислимый тип без маркера расширения кодируется как ограниченное целое, ограничение подтипа которого не содержит маркер расширения. Это означает, что на практике перечислимый тип будет почти всегда кодироваться как битовое поле с минимальным количеством битов, необходимых для
17