Я использую библиотеку 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 вызовом функции сжатия.
LZ4_decompress_safe_continue()
а также LZ4_decompress_fast_continue()
можно декодировать только полные блоки. Они считают частичный блок ошибкой и сообщают об этом. Они также считают, что если недостаточно места для распаковки полного блока, это также ошибка.
Функциональность, которую вы ищете, еще не существует. Но есть близкий родственник, который может помочь.
LZ4_decompress_safe_partial()
может декодировать часть блока.
Обратите внимание, что в отличие от _continue()
варианты, он работает только на независимых блоках.
Также обратите внимание, что сжатый блок должен быть тем не менее завершенным, а выходной буфер должен, тем не менее, иметь достаточно места для декодирования всего блока. Таким образом, единственное преимущество, предоставляемое этой функцией, — это скорость: если вам нужны только первые 10 байтов, она остановится, как только сгенерирует достаточно байтов.
«как только» не значит «точно в 10». Это может произойти намного позже, а в худшем случае — после декодирования всего блока. Это потому, что внутренний механизм декодирования все тот же: он декодирует целые последовательности и не «разбивает их» в середине, из соображений скорости.
Если вам нужно извлечь меньше байтов, чем полный блок, чтобы сэкономить память, я боюсь, что решения пока нет. Сообщите об этом как запрос функции в апстрим.
Кажется, это было реализовано в lz4 1.8.3.