ГОСТ Р 53556.11—2014
if(( dec_chars <= nchars) && ( last_string_code /= -1 ) <&<£( freeze_flag == 0 )) {
sciNewEntryToDictf rwxt_code. last_string_code. charCode );
next_code ♦+;
)
}
last_string_code = string_code:
}
}
П р и м е ч а н и е
—
Функция inputCode
( )
читает число битов
«
code_bitsя из закодированного потока битов
и возвращает stringjcode. Функция decodeString () берет string_code в качестве входного значения и возвращает
декодированную строку символов, связанную с string_code. путем поиска в словаре, число символов в
декодируе мой строке и код первого символа строки charCode. Функция setNewEr>tryToDict{) берет last_slring_code и
charCode и устанавливает их в свободную запись словаря, представленную как nexl_code. Функция FlushDict{)
очищает все записи словаря и инициализирует связанные знамения словаря. В вышеупомянутом псевдокоде
<tdec_bufo явля ется буфером для сохранения декодируемых символов, a «ncharsя является числом символов,
которые должны декодироваться. В FlushDict() кcode_bits
»
устанавливается в 9.
«
bump_codeя устанавливается в
511 и ofreezejtag
»
устанавливается в 0.
После того, как входные символы декодируются из string_code. эти символы преобразовываются
в значения различия мантиссы. D[c][n],
Если nbits [с] [л], которое является размером слова символов, используемых в модуле Masked-LZ,
не кратно 8. это означает, что на стороне кодера были добавлены фиктивные биты.
Дополнительные биты более, чем nb/fs[cj[n). вырезаются (выбрасываются), используя следующий
алгоритм:
//reconstruction ofdifference values from decoded characters.
long n. i. nbits_aligned:
unsigned long acc.j:
j -
0
;
for (n = 0; n < framejength: n*+) {
if ( !int_zero(c][n)) {
if ( nbits[c][n] % 8) > 0)
nbits_aligned = 8 *((unsigned int)(nbits[c][n]/8) + 1):
else
nbits_aligned = nbits[c][n]:
acc =0;
for ( i = 0: i < nbits_aligned/8; /++)
acc = ( acc « 8 ) * dec_buflj++].
acc » = ( nbits_ahgned - nbits[cj[n]);
Uthrow away dummy bits added by the
encoder.
D[c][n] = acc:
}
}
П р и м е ч а н и е
—
«int_zero» является истиной, если соответствующее усеченное целое число равно 0.
яnbits [с] (л)» является необходимой длиной слова для различия мантиссы. «dec__buf (]» является буфером для
сохранения декодируемых символов.
6.9.3.3 Реконструкция данных с плавающей точкой
6.9.3.3.1 Реконструкция данных с плавающей точкой (когда acf_mantissa [с] равно 0)
Усеченные целочисленные значения преобразовываются в 32-разрядные данные с плавающей
запятой F[c][n] согласно определению 32-разрядмого формата с плавающей точкой IEEE, с нормализа
цией с точки зрения максимального целочисленного значения (223)
F[c][n] = (float) (truncated_intcger_valuey2~2i
Поле экспоненты F[c][n] является shift_value[c}. если shift_amp(c] равно 1.
Если целое число «0». кодированные данные с плавающей точкой используются как для оконча
тельного результата. Иначе восстановленное значение различия мантиссы D(c][n) добавляется к ман
тиссе данных с плавающей точкой Е[с][л]. преобразованных из целочисленного значения. Нет никакой
необходимости изменять ни знак, ни поле экспоненты /^сКл].
63