LZ4: сжатие форматов сжатых изображений

я использую Компрессор 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Хотя, глядя на код, трудно понять, как это может произойти. Если это вызывает озабоченность (и, конечно, если предоставление большего целевого буфера не решит проблему), я предлагаю вам пройтись по коду в отладчике, чтобы определить, в чем проблема.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]