Как определить уровень сжатия DEFLATE?
Существует десять различных уровней сжатия для DEFLATE (0 без сжатия и самое быстрое, 9 с лучшим сжатием и самое медленное). Каков наилучший способ определить такой уровень для необработанных данных DEFLATE?
Один очевидный (но медленный) метод состоит в том, чтобы попробовать каждый и сравнить последовательно. Как побочный вопрос, гарантируется ли, что размер сжатых данных для файла строго не увеличивается при переходе от уровня сжатия от 0 до 9? Если это так, бинарный поиск может ускорить эту процедуру в два / три раза.
2 ответа
Кроме медленного метода, нет.
Нет, нет гарантии, что сжатый размер является монотонным. Однако не быть монотонным довольно редко.
Если у вас есть только сжатые данные, они не содержат такой информации. Уровень сжатия настраивается только для сжатия, поэтому он не кодируется в сжатых данных.
Однако, если вы используете что-то вроде zlib, он добавляет заголовок, который включает в себя уровень сжатия. С https://tools.ietf.org/html/rfc1950:
FLEVEL (Compression level)
These flags are available for use by specific compression
methods. The "deflate" method (CM = 8) sets these flags as
follows:
0 - compressor used fastest algorithm
1 - compressor used fast algorithm
2 - compressor used default algorithm
3 - compressor used maximum compression, slowest algorithm
The information in FLEVEL is not needed for decompression; it
is there to indicate if recompression might be worthwhile.
Если вы не используете библиотеку, которая добавляет информационный заголовок, вы можете реализовать ее самостоятельно (если это действительно необходимо для вашего приложения). Это просто вопрос добавления дополнительного байта или двух (обычно) в начале.