2016-07-11 4 views
0

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

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

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

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

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

ответ

1

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

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

EDIT: В вашем случае вы также можете использовать декомпрессию потока LZ4, см. this code sample для получения дополнительной информации.

+0

'LZ4_decompress_safe (const char * source, char * dest, int compressSize, int maxDecompressedSize)' требует compressSize; передача 0/NULL приводит к неудачной декомпрессии. Все методы декомпрессии запрашивают параметр compressSize/originalSize, который неизвестен, но с максимальным значением. – KKlouzal

+0

Вы имеете в виду, что у вас нет сжатого размера, размер декомпрессии или нет? –

+0

Я не знаю «истинный» сжатый размер; Это может быть всего 500 байтов, но хранится внутри большего буфера в 1436 байт. Передача 1436 как «compressSize» терпит неудачу, когда передача 500 будет успешной. – KKlouzal

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