ГОСТ Р 53556.11—2014
6.9.3.2.5 Распаковка Masked-LZ
Сжатие Masked-LZ является видом, основанном на словаре схемы сжатия.
Это весьма подобно другим разновидностям сжатия Lempel-Ziv. таким как схема сжатия LZW. то
есть существует словарь строк, которые встретились ранее. Ищется самая длинная строка соответ
ствия входных символов, используя строку, сохраненную в словаре.
Диапазон code_bits меняется от 9 до 14 битов, так как индекс словаря кодируется как 9—15-бито
вый в зависимости от числа записей, сохраненных в словаре. Для синхронизации словаря в кодере и
декодере используются коды Bump и код Flush (таблица 47). bump_code сначала устанавливается в
511 и увеличивается в зависимости от записей, хранящихся в словаре.
Декодер читает (code_bits) биты из потока битов и получают string_code. Когда string_code явля
ется FLUSH_CODE или MAX_CODE. словарь и переменные, связанные со словарем, должны быть по
вторно инициализированы начальными значениями (таблица 44). Когда string_code является FREEZE_
CODE, декодер прекращает добавлять новые записи в словарь, пока он не встречается с фреймом
произвольного доступа или не получает FLUSH_CODE.
Т а б л и ц а 47 — Специальные индексные коды замаскироеанных-LZ
Диапазон
s1ring_code
Коды специального индекса
Величина
9<=
code_bits
<=15
FLUSH CODE
256
(0<=
stringCode <
32768)
FREEZE_ CODE
257
FIRST_CODE
258
BUMP_CODE
|2
codc^bits^
MAX_CODE
215—1
Алгоритм для распаковки Masked-LZ дается ниже.
//Masked-LZ decompression.
long п, i, readBits. string_code. last_strmg_code. charCode:
unsigned long dec_chars
last_string_code = -1;
for ( dec_chars = 0; dec_chars < nchars;) {
readBits = inputCode( &string_code. code_bits);
if ( string_code == FLUSH_CODE) || ( strmg_code == MAX_CODE)) {
FlushDictf):
last_string_codo = -1;
}
else if ( string_code == FREEZE_CODE) {
freeze_flag = 1;
}
else if ( string_code == bump_code) {
code_bits++:
bump_code = bump_code *2 + 1;
}
else {
if ( string_codo >= next_code) {
dec_chars += decodeStringf &doc_buf{dec_chars]. last_string_code. AcharCode);
dec_chars += decodeStringf&dec_bufldec_chars], charCode. AcharCode):
sotNewEntryToDictfnext_code. last_string_codo. charCode):
next_code +*:
}
else {
dec_chars += decodeStringfAdec_buf[dec_chars}. string_code. AcharCode):
62