2015-11-25 1 views
1

Я использую библиотеку LZ4 и при распаковке данных с:Как распаковать меньше оригинального размера с помощью библиотеки Lz4?

int LZ4_decompress_fast_continue (void* LZ4_streamDecode, const char* source, char* dest, int originalSize); 

мне нужно только первые n байт первоначально закодированных N байт, где n < N. Поэтому, чтобы улучшить производительность, имеет смысл распаковать только часть исходного буфера.

Интересно, могу ли я передать n вместо N в аргумент функции originalSize?

Мой первоначальный тест показал, что это невозможно (я получил неверно декомпрессированные данные). Хотя, может быть, есть способ, например, если n является кратным некоторого CHUNK_SIZE? Все оригинальные байты N были сжаты с 1 вызовом функции сжатия.

ответ

3

LZ4_decompress_safe_continue() и LZ4_decompress_fast_continue() могут декодировать только полные блоки. Они рассматривают частичный блок как ошибку и сообщают об этом как таковой. Они также считают, что если не хватает места для распаковки полного блока, это также ошибка.

Функциональность, которой вы ищите, пока не существует. Но есть близкий родственник, который может помочь.

LZ4_decompress_safe_partial() может декодировать часть блока. Обратите внимание, что в отличие от _continue() вариантов он работает только на независимых блоках. Обратите также внимание на то, что сжатый блок должен, тем не менее, быть полным, и выходной буфер должен, тем не менее, иметь достаточно места для декодирования всего блока. Таким образом, единственным преимуществом этой функции является скорость: если вы хотите только первые 10 байтов, она будет остановлена, как только она создаст достаточное количество байтов.

«как только» не означает «точно в 10». Это может быть намного позже, и в худшем случае это может быть после декодирования всего блока. Это связано с тем, что механизм внутреннего декодирования по-прежнему остается тем же: он декодирует целые последовательности и не «разбивает их» по середине, для соображений скорости.

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

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

  • Нет связанных вопросов^_^