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

Описание из Википедии:

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

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

Объяснение на здесь также было для меня непостижимым.

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


person ade    schedule 15.01.2014    source источник
comment
например, рассмотрим строку беззнаковых символов: привет, Эдди, как дела. Как они будут сжаты?   -  person ade    schedule 15.01.2014
comment
Следующая ссылка предлагает очень хорошее объяснение формата сжатия LZ4 и того, как он работает: brutaldeluxe.fr/products/crossdevtools/lz4/index.html   -  person Cyan    schedule 15.01.2014
comment
хорошо, значит, в каждом сжатом блоке может быть одна буквальная секция и много совпадающих частей? Это может показаться логичным, поскольку последовательность байтов может повторяться десятки раз. Так ли это?   -  person ade    schedule 15.01.2014


Ответы (1)


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

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

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

person Mark Adler    schedule 15.01.2014