ГОСТ Р ИСО/МЭК 24778 — 2010
Также необходимо определить несколько именованных переменных. Два целочисленных массива с
шестью элементами CurLen[State] и NxtLen[State] содержат накапливаемые длины в битах закодированных
строк, завершающихся всостоянии «State». Два соответствующих строковых массиваCurSeqfState] и NxtSeq[State]
содержат информацию о закодированных строках, представленных соответствующим значением CurLen и NxtLen.
(Одна из возможных схем: знаки фиксации обозначают прописными буквами, за ними следуют числа, определя
ющее число кодов знаков, которые были напрямую закодированы в этом кодовом наборе, между ними вставляют
отдельные строчные буквы для переключения регистра на один знак). В дополнительной переменной ВаскТо
хранится информация о состоянии, из которого произошел переход, вызванный знаком регистра Binary Shift.
В исходном состоянии элемент CurLen[U] равен нулю, так как состояние Upper является исходным состоя
нием по умолчанию, а все остальные элементы CurLen равны «Е» — признаку пустого значения (например,
такими большими значениями, как 10000). Строки CurSeq изначально находятся в неопределенном состоянии
(null), а переменной ВаскТо задано значение U.
Далее входную строку последовательно обрабатывают по одному знаку, при этом используют следующий
алгоритм:
1) Сначала следует проверить, нельзя ли уменьшить какие-либо элементы из CurLen за счет фиксации из
другого состояния. Для этого перебирают все возможные комбинации состояний X и Y:
ЕСЛИ (CurLenIX] +LatLen[X][Y]} МЕНЬШЕ CufLen[Y). ТО:
(a) уменьшить CurLenJY)до (CurLen[X] + LatLen[YJ[X]) и
(
b
) заменить CurSeq[Y] на (CurSeq[X) плюс признак фиксации в Y).
Если «фиксация» находится в состоянии Binary, то переменная ВаскТо сохраняет состояние X. Соответ
ственно возврат из фиксации в состоянии Binary может произойти только в состояние, сохраненное в переменной
ВаскТо. Следует обратить внимание на то. что на этой стадии ни один из элементов CurLen уже не содержит
«пустого» значения.
2) Всем элементам NxtLen присваивают признак «пустого» значения.
3) Получаем следующий входной знак и находим по таблице 2’>все кодовые наборы, в которых этот знак
может кодироваться напрямую (как правило такой кодовый набор один, хотя в отдельных случаях таких наборов
также может быть либо ноль, либо два и более, плюс всегда знак Binary (кроме знаков, не являющихся знаками
данных)). Для каждого такого состояния X:
a) выполнить непосредственное расширение этого состояния:
ЕСЛИ (CurLen[X) +CharSiz[XJ) МЕНЬШЕ NxtLen[X], ТО:
(a) уменьшить NxtLen[X] до (CurLen[X] +CharSir(XJ) и
(b) заменить NxtSeq[X) на (CurSeq[XJ плюс признак кодирования еще одного знака);
b
) также проверить все возможные прямые переключения регистров из всех состояний Y. отличаю
щихсяотX:
ЕСЛИ (CurLen[Y] +ShftLen(Y][X] +CharSiz(X]) МЕНЬШЕ NxtLen(Y], ТО:
(a) уменьшить NxtLen(Y) до (CurLen[Y] +ShftLen[Y][X) +CharS iz[X))и
(b) заменить NxtSeqfYJ на (CurSeq(Y] плюс признак регистрового перехода в состояние X для
одного знака).
4) В особом случае, когда сам знак и его предшественник образуют одну из двузначных последовательнос
тей. представляемых в кодовом наборе Punctuation:
ЕСЛИ CurLen(Punct] МЕНЬШЕ NxtLen[Punct], ТО
(a) уменьшить NxtLen[Punct] до CurLen[Punct] и
(
b
) заменить NxtSeq[Punct] на CurSeq[Punct).
5) Если NxtSeq[Binary] указывает на то. что с последнего перехода, вызванного знаком регистра Binary Shift,
было закодировано ровно 32 байта, следует увеличить значение NxtLen(Binary) на 11.
6) В итоге все элементы массива NxtLen должны быть перемещены в соответствующие элементы массива
CurLen. а все элементы массива NxtSeq — в соответствующие элементы массива CurSeq.
П р и м е ч а н и е — На этой стадии некоторые элементы массива CurLen снова могут содержать признак
«пустого» значения.
7) Если во входном потоке остаются необработанные знаки, следует вернуться к шагу 1.
Когда все входные данные будут обработаны, следует определить, какое состояние обладает наименьшим
значением массива CurLen. Соответствующий элемент массива CurSeq описывает путь кодирования, обеспечи
вающий минимальную длину двоичного потока.
1
В
оригинале
ИСО/МЭК 24778
ошибочно
указано «таблица 1».
41