LZ4: декомпрессия блока двоичной памяти неизвестного размера

Я пытаюсь распаковать блок памяти, но я не знаю его исходного несжатого размера, однако я знаю максимальный размер этого исходного блока памяти.

Есть ли способ распаковать с LZ4, не зная исходного несжатого размера?

Краткий рассказ-длинный: я сериализую кучу переменных в поток строк, используя стороннюю библиотеку под названием Cereal. Cereal будет сериализовать ваши данные в строковый поток, используя «переносимый двоичный формат», что означает, что порядок байтов сохраняется и даже преобразуется в таковой на хост-машинах во время десериализации, если это необходимо. Затем поток строк сжимается с помощью LZ4 и передается на удаленный компьютер для распаковки и десериализации.

Моя проблема в том, что LZ4 будет выводить блок памяти сжатых данных и целое число, определяющее размер сжатых данных. Для распаковки вам нужен сжатый размер и исходный размер, и я отправляю только сжатый блок данных на удаленные машины.

Итак, есть ли способ распаковать блок данных с помощью LZ4, не зная его исходный сжатый размер? По сути, «начните декомпрессию, когда у вас закончатся данные, и вы закончили»


person KKlouzal    schedule 11.07.2016    source источник


Ответы (1)


Функция LZ4_decompress_safe (см. https://github.com/Cyan4973/lz4/blob/master/lib/lz4.c#L1288), похоже, требует только максимальный размер распакованного файла. В этом случае вы можете выделить достаточно большой буфер для распаковки и использовать его.

Так что либо так, либо также перенесите исходный несжатый размер на удаленные машины.

РЕДАКТИРОВАТЬ: в вашем случае вы также можете использовать потоковую декомпрессию LZ4, см. этот код образец для получения дополнительной информации.

person Tal Ben-Nun    schedule 11.07.2016
comment
LZ4_decompress_safe(const char* source, char* dest, int compressedSize, int maxDecompressedSize) требуется compressedSize; передача 0 / NULL приводит к неудачной декомпрессии. Все методы декомпрессии запрашивают сжатый размер / исходный размер, который неизвестен, но имеет максимальное значение. - person KKlouzal; 12.07.2016
comment
Вы имеете в виду, что у вас нет сжатого размера, разархивированного размера или ни того, ни другого? - person Tal Ben-Nun; 12.07.2016
comment
Я не знаю «истинного» сжатого размера; Он может быть всего 500 байтов, но хранится в большем буфере размером 1436 байтов. Передача 1436 как compressedSize не удалась, а 500 - успешной. - person KKlouzal; 12.07.2016
comment
Если данные предоставлены только частично, не каждый алгоритм сжатия будет успешным (например, если вы сломаете блок LZ4, вы не сможете его распаковать). Однако, если вы знаете, что даны целые блоки, почему бы не использовать функциональность потокового декодирования LZ4 (LZ4_createStreamDecode)? - person Tal Ben-Nun; 12.07.2016
comment
См. Мою правку для примера кода потоковой декомпрессии с LZ4. - person Tal Ben-Nun; 12.07.2016