При анализе файла GIF дескриптор изображения включает разрядность незакодированных символов (пример: 8 бит). Как вы, вероятно, уже знаете, исходный размер кода сжатых данных на один бит больше, чем разрядность незакодированных символов (пример: 9 бит).
Кроме того, как вы, вероятно, уже знаете, возможные значения сжатого кода в файле GIF постепенно увеличиваются в размере, вплоть до максимального значения 0xFFF == 4095, для хранения которого требуется 12 бит.
Для каждого кода, который декомпрессор извлекает из сжатых данных, декомпрессор добавляет новый элемент в свой словарь. Например, если декомпрессор считывает первые два 9-битных кода 0x028 0x0FF, декомпрессор добавляет двухбайтовую последовательность в свой словарь. Позже, если декомпрессор когда-либо считывает код 0x102, декомпрессор декодирует этот код 0x102 в два 8-битных байта 0x28 0xFF.
Следующему элементу, который декомпрессор добавляет в словарь, присваивается код 0x103.
Следующему элементу, который декомпрессор добавляет в словарь, присваивается код 0x104. ...
В конце концов декомпрессор добавляет в словарь элемент, которому присваивается код 0x1FF. Это самое большое число, которое помещается в 9 бит. После сохранения этого элемента в словаре декомпрессор начинает считывать 10-битные коды.
Следующему элементу, который декомпрессор добавляет в словарь, присваивается код 0x200.
В последовательности данных нет какой-либо специальной «команды», которая сообщает распаковщику увеличить ширину кода. Декомпрессор должен отслеживать, сколько элементов словарь содержит на данный момент (что часто может быть удобно повторно использовано в качестве указателя того, куда записать следующий элемент в словарь). Когда декомпрессор добавляет в словарь элемент 0x1ff, декомпрессору пора начинать считывать 10-битные коды. Когда декомпрессор добавляет элемент 0x3ff в словарь, декомпрессору пора начинать считывать 11-битные коды.
person
David Cary
schedule
30.05.2011