я использую Компрессор LZ4 C lib. Некоторые из файлов, которые я сжимаю, — это JPG и PNG. По какой-то причине, которую я не понимаю, метод
int compressedSize = LZ4_compress_default((char*)data,
compressedData, uncompressedSize, uncompressedSize);
Иногда возвращает отрицательные значения для изображений (или ноль), которые я сжимаю.
Например, я сжимаю два стандартных изображения JPG. Один возвращает значение -236, а второй возвращает точное количество сжатых байтов, что означает, что первый не удалось сжать. Нулевой возврат означает, что LZ4 не удалось сжать. Понятия не имею, что означает -236. Это потому, что исходные данные уже сжаты до некоторой степени?
Определение возврата функции:
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
Хотя, глядя на код, трудно понять, как это может произойти. Если это вызывает озабоченность (и, конечно, если предоставление большего целевого буфера не решит проблему), я предлагаю вам пройтись по коду в отладчике, чтобы определить, в чем проблема.
Других решений пока нет …