Я использую компрессор LZ4 C lib. Некоторые из файлов, которые я сжимаю, - это JPG и PNG. По какой-то причине, которую я не понимаю, метод
int compressedSize = LZ4_compress_default((char*)data,
compressedData, uncompressedSize, uncompressedSize);
Иногда возвращает отрицательные значения для изображений (или ноль), которые я сжимаю.
Например, я сжимаю два стандартных изображения JPG. Один возвращает значение «-236», а второй возвращает точное количество сжатых байтов, что означает, что первый не смог сжать. Нулевой возврат означает, что LZ4 не сжимался. Понятия не имею, что означает -236. Это потому, что исходные данные в какой-то степени уже сжаты?
1 ответ
Определение возврата функции:
return : the number of bytes written into buffer 'dest' (necessarily <= maxOutputSize) or 0 if compression fails
Если сжатие привело к размеру больше, чем uncompressedSize
, что весьма вероятно для уже сжатого файла, функция завершится ошибкой. Однако это не объясняет, почему он вернул отрицательное значение - это не задокументировано. Но остается в том случае, если вам нужно разместить сжатые файлы, вам нужно разрешить увеличение размера файла, предоставив больший буфер.
Глядя на исходный код, возвращаемое значение генерируется в LZ4_compress_generic()
от:
return (int) (((char*)op)-dest);
Арифметика указателя вернет отрицательное значение, если op
<dest
, хотя, глядя на код, трудно понять, как это могло произойти. Если это вызывает беспокойство (и, конечно, если просто предоставление большего целевого буфера не решает проблему), я предлагаю вам выполнить код в отладчике, чтобы определить, в чем проблема.
Похожие вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.