2009-04-21 4 views
2

Я использую MiniLZO для проекта для некоторых действительно простых задач сжатия. Я сжимаю одну программу и декомпрессию с другой. Я хотел бы знать, сколько места выделяется для буфера декомпрессии. Я в порядке с избыточным распределением пространства, если это может избавить меня от необходимости комментировать мой выходной файл целым числом, объявляющим, сколько места должны были бы декомпрессированные данные. Как бы я понял, сколько места он может взять?Размер буфера декомпрессии LZO

После некоторого рассмотрения, я думаю, этот вопрос сводится к следующему: Какова максимальная степень сжатия сжатия lzo1x?

ответ

4

Поскольку вы управляете как компрессором, так и декомпрессором, я предлагаю вам сжать вход в блоки фиксированного размера. В моем приложении я сжимаю до 64KB в каждом блоке, а затем испускают размер сжатого блока и сами сжатых данных, поэтому сжатый поток на самом деле выглядит как серия сжатых блоков:

length_of_block_1 
block_1 
length_of_block_2 
block_2 
... 

Декодировщик просто читает каждый сжатый блок и распаковывает его в буфер 64 КБ, так как я знаю, что блок был создан путем сжатия блока размером 64 КБ.

Надежда, что помогает,

Эрик Melski

+0

Это тоже хорошее предложение, но оно добавляет аннотации - именно то, чего я надеялся избежать. Таким образом, я могу просто сжать мои данные в одном блоке (так как он уже сохранен) и аннотировать его размером блока. – Benson

+0

Я думал, вы просто хотели избежать хранения * распакованного * размера на выходе. Я не думаю, что вы можете избежать хранения какого-либо маркера конца блока, если только вы не убедитесь, что входные блоки всегда меньше N байтов; то каждый сжатый поток имеет ровно один блок, поэтому вам не нужен разделитель. Или вы можете расширить декомпрессор, чтобы возвращать частичный результат и код «больше делать», когда он заполняет буфер, поэтому вы можете называть его повторно, чтобы распаковать весь ввод. –

+0

Все хорошие предложения, но я думаю, что сохранение размера распакованного буфера будет проще. Итак, я думаю, что ответ на мой вопрос - это «справиться с этим и аннотировать с декомпрессированным размером». – Benson

2

Максимальный размер распакованных данных, очевидно, совпадает с максимальным размером сжатых данных в первую очередь.

Если есть верхняя граница вашего размера ввода, то, я думаю, вы можете использовать его, но я должен сказать, что обычный способ сделать это - добавить заголовок в сжатый буфер, который определяет несжатый размер.

+0

Спасибо, я буду держать это в виду. К сожалению, я не контролирую максимальный размер. Похоже, мне, вероятно, придется добавить заголовок, если я хочу сделать это безопасно. – Benson

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