2014-01-15 5 views
6

Описание от Wikipedia:LZ4 алгоритм сжатия объяснение

Алгоритм LZ4 представляет данные в виде серии последовательностей. Каждая последовательность начинается с однобайтового токена, разбитого на два 4-битных поля. Первое поле представляет количество буквенных байтов, которые должны быть скопированы на выход. Второе поле представляет количество байтов для копирования из уже декодированного выходного буфера (с 0, представляющим минимальную длину соответствия 4 байта). Значение 15 в любом из битовых полей указывает, что длина больше и есть дополнительный байт данных, который должен быть добавлен к длине. Значение 255 в этих дополнительных байтах указывает, что еще один байт будет добавлен. Следовательно, произвольные длины представлены рядом дополнительных байтов, содержащих значение 255. После того, как в строке литералов появится токен и любые дополнительные байты, необходимые для указания длины строки. За этим следует смещение, указывающее, как далеко назад в выходном буфере начать копирование. Дополнительные байты (если они есть) длины совпадения поступают в конце последовательности

Я этого не понимал! У кого-нибудь есть простой способ понять пример? Например, в приведенном выше объяснении, что такое буквальный байт и что такое совпадение? Как мы можем иметь декодированный выходной буфер, когда мы только начинаем сжимать? Длина чего?

Объяснение в here было также непроницаемым для меня.

Простой пример будет приятным, если у вас нет лучшего способа объяснить это.

+0

Например, рассмотрим строку unsigned chars: «hello eddy how are you». Как они сжались? – ade

+4

Следующая ссылка предлагает очень хорошее объяснение формата сжатия LZ4 и того, как он работает: http://www.brutaldeluxe.fr/products/crossdevtools/lz4/index.html – Cyan

+0

ОК, поэтому в каждом сжатом блоке может быть один литерал и многое другое? Это казалось бы логичным, так как последовательность байтов повторялась десятки раз. Это так? – ade

ответ

6

Во-первых, прочтите около LZ77, используемый основной подход. Текст представляет собой описание конкретного способа кодирования ряда литералов и совпадений строк в предыдущих данных.

Соответствие, когда следующие последующие байты в несжатых данных происходят в ранее декомпрессированных данных. Поэтому вместо отправки этих байтов напрямую отправляется длина и смещение. Затем вы смещаете байты назад и копируете длину байтов в выходной файл.

Да, вы не можете иметь совпадение в начале потока. Вы должны начать с литератур. (Если нет предустановленного словаря, что является еще одной темой.)

Смежные вопросы