ГОСТ Р ИСО/МЭК 8825-2-2003 октетов, как определено в 10.3, количество занятых под кодирование октетов 1еп используется в других разделах, которые ссылаются на настоящий подраздел для спецификации кодирования длины.
10.9 Общие правила кодирования детерминанта длины
Примечания
1 Процедуры настоящего подраздела вызываются для некоторой части кодирования, когда необходима явная длина поля независимо от того, ограничен сверху счетчик длины (видимыми для PER ограничениями) или нет. Часть кодирования, к которой относится длина, может быть битовой строкой (со счетчиком длины в битах), строкой октетов (со счетчиком длины в октетах), символьной строкой известной кратности (со счетчиком длины в символах) или списком полей (со счетчиком длины в компонентах последовательности-из или множества-из).
2 В случае варианта ALIGNED, если счетчик длины ограничен верхней границей, которая меньше 64К, для длины используется кодирование ограниченного целого числа. Для достаточно маленьких диапазонов результатом является битовое поле, в противном случае неограниченная длина (обозначенная и) кодируется в выровненном по октету поле битов одним из трех способов (в порядке увеличения размера):
а) (и меньше 128) единственный октет, содержащий и с равным нулю битом 8;
б) (и меньше 16К) два октета, содержащие и с битом 8 первого октета, равным 1, и битом 7, равным
нулю;
в) (большое и) единственный октет, содержащий счетчик т с 8 и 7 битами, равными 1. Счетчик т равен от 1 до 4, а длина указывает, какой фрагмент данных следует дальше (т, умноженное на 16К элементов). За определенным значением т фрагментом следует другая длина кодирования для оставшихся данных.
3 В случае варианта UNALIGNED, если счетчик длины ограничен верхней границей, которая меньше 64К, для кодирования длины в минимальном количестве битов, необходимых для представления диапазона, используется кодирование ограниченного целого числа. В противном случае неограниченная длина (обозначенная и) кодируется в битовое поле способом, описанным в примечании 2.
10.9.1 Процедуры настоящего подраздела не вызываются, если в соответствии со спецификациями последующих разделов значение детерминанта длины п фиксировано определением типа (с видимыми для PER ограничениями), и это значение меньше 64К.
10.9.2 Процедуры настоящего подраздела вызываются в дополнение к списку полей, содержащему поля или списки полей, с предшествующим детерминантом длины п, который определяет:
а) длину в октетах ассоциированного поля (единицами являются октеты), либо
б) длину в битах ассоциированного поля (единицами являются биты), либо
в) число компонентов, закодированных в ассоциированном списке полей (единицами являются компоненты множества-из или последовательности-из), либо
г) число символов в значении ассоциированного типа символьной строки известной кратности (единицами являются символы).
10.9.3 (Вариант ALIGNED) Процедуры для варианта ALIGNED специфицированы в 10.9.3.1— 10.9.3.8.4. (Процедуры для варианта UNALIGNED специфицированы в 10.9.4.)
10.9.3.1 В результате анализа определения типа (установленного в последующих разделах) определяется, будет ли детерминант длины (целое число п):
а) обычно маленькой длиной с нижней границей 1Ь = 1; либо
б) ограниченным целым числом с нижней границей 1Ь > 0 и верхней границей ub < 64К, либо
в) полуограниченным целым числом с нижней границей 1b > 0 или ограниченным целым числом с нижней границей 1b > 0 и верхней границей ub > 64К.
10.9.3.2 Подраздел, вызывающий процедуры настоящего подраздела, должен определить значения для нижней 1b (равное нулю, если длина неограничена) и верхней ub границ длины. ub не устанавливается, если нет верхней границы, определимой по видимым для PER ограничениям.
10.9.3.3 Когда детерминант длины является ограниченным целым числом с ub < 64К, список полей будет добавлен к кодированию этого ограниченного целого числа для детерминанта длины, как определено в 10.5. Если п не равно нулю, то за ним должно следовать ассоциированное поле или список полей, и процедура завершается. Если п равно нулю, то к списку полей ничего не добавляется, и процедура завершается.
Примечания
1 Например:
А :: = Foo (SIZE (3..6)) -- Длина кодируется в 2-битовом поле
В :: = Foo (SIZE (40000..40254)) -- Длина кодируется в 8-битовом поле
С :: = Foo (SIZE (0..32000)) -- Длина кодируется в 2 октета, выровненного по октету битового поля
D :: = Foo (SIZE (64000)) -- Длина не кодируется
14