Я пытаюсь распаковать блок памяти, но я не знаю, какой у него исходный несжатый размер, однако я знаю, какой максимальный размер может быть у этого оригинального блока памяти.
Есть ли способ распаковать с помощью LZ4, не зная оригинального несжатого размера?
Short-Строй-Long:
Я сериализую кучу переменных в поток строк, используя стороннюю библиотеку под названием Cereal.
Cereal будет сериализовать ваши данные в поток строк, используя «переносимый двоичный формат», что означает, что при сохранении последовательности порядок байтов сохраняется и даже преобразуется в порядковый номер хост-машин.
Затем поток строк сжимается с использованием LZ4 и передается на удаленный компьютер для распаковки и десериализации.
Моя проблема в том, что LZ4 выведет блок памяти сжатых данных и целое число, указывающее размер сжатых данных. Для распаковки вам нужен сжатый размер и исходный размер, и я отправляю только сжатый блок данных на удаленные машины.
Итак, есть ли способ распаковать блок данных с помощью LZ4, не зная его первоначальный сжатый размер? По сути, «начать декомпрессию, когда у вас заканчиваются данные, которые вы сделали»
Функция LZ4_decompress_safe
(увидеть https://github.com/Cyan4973/lz4/blob/master/lib/lz4.c#L1288Кажется, требуется только максимальный распакованный размер. В этом случае вы можете выделить достаточно большой буфер для распаковки и использовать его.
Так что или это, или перенесите оригинальный несжатый размер на удаленные машины.
РЕДАКТИРОВАТЬ: В вашем случае вы также можете использовать потоковую декомпрессию LZ4, см. этот пример кода для дополнительной информации.
Других решений пока нет …