Я обычно рекомендую сначала написать декомпрессор, а затем написать компрессор, соответствующий ему.
Я рекомендую сначала заставить компрессор и соответствующий декомпрессор работать с копируемыми элементами фиксированного размера, а затем - при необходимости - настраивать их для создания / потребления копируемых элементов переменного размера.
Многие LZ77-подобные алгоритмы используют фиксированный размер в сжатом файле для представления как положения, так и длины;
часто одна шестнадцатеричная цифра для длины и 3 шестнадцатеричных цифры для позиции, всего 2 байта.
"|" между положением и длиной копии не требуется.
Если вы действительно пытаетесь реализовать оригинальный алгоритм LZ77,
ваш алгоритм сжатия должен всегда выдавать длину копии с фиксированной длиной (даже если она равна нулю), позицию с фиксированной длиной (когда длина равна нулю, вы также можете придерживаться нуля и здесь) и литерал с фиксированной длиной значение.
Некоторые LZ77-подобные форматы файлов подразделяются на «элементы», которые представляют собой фиксированную длину копии, пару позиций или одно или несколько литеральных значений.
Если вы идете по этому пути, компрессор должен сначала как-то сообщить декомпрессору, представляет ли предстоящий элемент буквальное значение (я) или пару позиций длины копии.
Один из многих способов сделать это - зарезервировать специальное значение позиции «0», которое вместо указания какой-либо позиции в выходном распакованном потоке, как и все другие значения позиции, вместо этого указывает следующие несколько литеральных значений во входном сжатом файле.
Почти все алгоритмы, подобные LZ77, сохраняют «смещение» назад от текущего местоположения в открытом тексте, а не «положение» вперед от начала открытого текста.
Например, «1» представляет самый последний декодированный байт открытого текста, а не первый декодированный байт открытого текста.
Как декодер может определить, где заканчивается одно целое число и начинается ли следующее, когда сжатый файл содержит серию целых чисел?
Есть 3 популярных ответа:
- Используйте код фиксированной длины, где вы указали в камне во время компиляции, как долго будет длиться каждое целое число. (Простейшие)
- Используйте код переменной длины и зарезервируйте специальный символ, такой как "|" указать конец кода.
- Используйте префиксный код переменной длины .
- другие подходы, такие как кодирование диапазона. (самое сложное)
http://en.wikibooks.org/wiki/Data_Compression
Иаков Зив и Авраам Лемпель; Универсальный алгоритм последовательного сжатия данных , IEEE транзакции по теории информации, 23 (3), с.337-343, май 1977 г.