класс Zlib::Deflate
Zlib::Deflate — это класс для сжатия данных. Дополнительные сведения см. в разделе Zlib::ZStream.
Публичные методы класса
static VALUE
rb_deflate_s_deflate(int argc, VALUE *argv, VALUE klass)
{
struct zstream z;
VALUE src, level, dst, args[2];
int err, lev;
rb_scan_args(argc, argv, "11", &src, &level);
lev = ARG_LEVEL(level);
StringValue(src);
zstream_init_deflate(&z);
err = deflateInit(&z.stream, lev);
if (err != Z_OK) {
raise_zlib_error(err, z.stream.msg);
}
ZSTREAM_READY(&z);
args[0] = (VALUE)&z;
args[1] = src;
dst = rb_ensure(deflate_run, (VALUE)args, zstream_ensure_end, (VALUE)&z);
return dst;
} Сжимает заданную string. Допустимые значения level: Zlib::NO_COMPRESSION, Zlib::BEST_SPEED, Zlib::BEST_COMPRESSION, Zlib::DEFAULT_COMPRESSION или целое число от 0 до 9.
Этот метод почти эквивалентен следующему коду:
def deflate(string, level) z = Zlib::Deflate.new(level) dst = z.deflate(string, Zlib::FINISH) z.close dst end
См. также Zlib.inflate
static VALUE
rb_deflate_initialize(int argc, VALUE *argv, VALUE obj)
{
struct zstream *z;
VALUE level, wbits, memlevel, strategy;
int err;
rb_scan_args(argc, argv, "04", &level, &wbits, &memlevel, &strategy);
TypedData_Get_Struct(obj, struct zstream, &zstream_data_type, z);
err = deflateInit2(&z->stream, ARG_LEVEL(level), Z_DEFLATED,
ARG_WBITS(wbits), ARG_MEMLEVEL(memlevel),
ARG_STRATEGY(strategy));
if (err != Z_OK) {
raise_zlib_error(err, z->stream.msg);
}
ZSTREAM_READY(z);
return obj;
} Создает новый поток deflate для сжатия. Если для аргумента задано nil, используется его значение по умолчанию.
Параметр level задает уровень сжатия потока deflate в диапазоне от 0 (без сжатия) до 9 (максимальное сжатие). Для повышения читаемости кода определены следующие константы:
-
Zlib::DEFAULT_COMPRESSION
-
Zlib::NO_COMPRESSION
-
Zlib::BEST_SPEED
-
Zlib::BEST_COMPRESSION
Дополнительные сведения см. на странице www.zlib.net/manual.html#Constants.
Параметр window_bits задает размер буфера истории и должен иметь значение от 8 до 15. Большие значения этого параметра обеспечивают лучшее сжатие за счет увеличения расхода памяти.
Параметр mem_level задает объем памяти, выделяемой для внутреннего состояния сжатия. Значение 1 требует минимального объема памяти, но снижает скорость и степень сжатия, тогда как значение 9 использует максимальный объем памяти для достижения оптимальной скорости. Значение по умолчанию — 8. Определены две константы:
-
Zlib::DEF_MEM_LEVEL
-
Zlib::MAX_MEM_LEVEL
Параметр strategy задает стратегию сжатия deflate. Доступны следующие стратегии:
- Zlib::DEFAULT_STRATEGY
-
Для обычных данных
- Zlib::FILTERED
-
Для данных, созданных фильтром или предиктором
- Zlib::FIXED
-
Запрещает динамические коды Хаффмана
- Zlib::HUFFMAN_ONLY
-
Запрещает сопоставление строк
- Zlib::RLE
-
Предназначена для более эффективного сжатия данных изображений PNG
Дополнительные пояснения см. в описании констант.
Примеры
Основы
open "compressed.file", "w+" do |io|
io << Zlib::Deflate.new.deflate(File.read("big.file"))
end
Настраиваемое сжатие
open "compressed.file", "w+" do |compressed_io|
deflate = Zlib::Deflate.new(Zlib::BEST_COMPRESSION,
Zlib::MAX_WBITS,
Zlib::MAX_MEM_LEVEL,
Zlib::HUFFMAN_ONLY)
begin
open "big.file" do |big_io|
until big_io.eof? do
compressed_io << zd.deflate(big_io.read(16384))
end
end
ensure
deflate.close
end
end
Этот пример будет работать, однако для оптимизации рекомендуется проверить флаги с учетом конкретных требований к времени выполнения, использованию памяти и размеру выходных данных.
Публичные методы экземпляра
static VALUE
rb_deflate_addstr(VALUE obj, VALUE src)
{
do_deflate(get_zstream(obj), src, Z_NO_FLUSH);
return obj;
} Передает string в поток deflate, как и Zlib::Deflate#deflate, но возвращает сам объект Zlib::Deflate. Результат работы потока сохраняется в выходном буфере.
static VALUE
rb_deflate_deflate(int argc, VALUE *argv, VALUE obj)
{
struct zstream *z = get_zstream(obj);
VALUE src, flush;
rb_scan_args(argc, argv, "11", &src, &flush);
struct rb_zlib_deflate_arguments arguments = {z, src, ARG_FLUSH(flush)};
return rb_mutex_synchronize(z->mutex, rb_deflate_deflate_body, (VALUE)&arguments);
} Передает string в поток deflate и возвращает результат работы потока. При вызове этого метода очищаются и входной, и выходной буферы потока. Если string равно nil, метод завершает поток, как и Zlib::ZStream#finish.
Если передан блок, последовательные сжатые фрагменты из string передаются в блок, а возвращается nil.
Параметр flush задает режим сброса. Можно использовать следующие константы:
- Zlib::NO_FLUSH
-
По умолчанию
- Zlib::SYNC_FLUSH
-
Сбрасывает выходные данные до границы байта
- Zlib::FULL_FLUSH
-
SYNC_FLUSH + сбрасывает состояние сжатия
- Zlib::FINISH
-
Обрабатывает ожидающие входные данные и сбрасывает ожидающие выходные данные.
Дополнительные пояснения см. в описании констант.
static VALUE
rb_deflate_flush(int argc, VALUE *argv, VALUE obj)
{
struct zstream *z = get_zstream(obj);
VALUE v_flush;
int flush;
rb_scan_args(argc, argv, "01", &v_flush);
flush = FIXNUMARG(v_flush, Z_SYNC_FLUSH);
if (flush != Z_NO_FLUSH) { /* prevent Z_BUF_ERROR */
zstream_run(z, (Bytef*)"", 0, flush);
}
return zstream_detach_buffer(z);
} Этот метод эквивалентен deflate('', flush). Он предоставлен исключительно для повышения читаемости программы на Ruby. Если передан блок, фрагменты выходных данных deflate передаются в блок до тех пор, пока буфер не будет сброшен.
Описание констант flush NO_FLUSH, SYNC_FLUSH, FULL_FLUSH и FINISH см. в разделе Zlib::Deflate#deflate.
static VALUE
rb_deflate_init_copy(VALUE self, VALUE orig)
{
struct zstream *z1, *z2;
int err;
TypedData_Get_Struct(self, struct zstream, &zstream_data_type, z1);
z2 = get_zstream(orig);
if (z1 == z2) return self;
err = deflateCopy(&z1->stream, &z2->stream);
if (err != Z_OK) {
raise_zlib_error(err, 0);
}
z1->input = NIL_P(z2->input) ? Qnil : rb_str_dup(z2->input);
z1->buf = NIL_P(z2->buf) ? Qnil : rb_str_dup(z2->buf);
z1->flags = z2->flags;
return self;
} Создает копию потока deflate.
static VALUE
rb_deflate_params(VALUE obj, VALUE v_level, VALUE v_strategy)
{
struct zstream *z = get_zstream(obj);
int level, strategy;
int err;
uInt n;
long filled;
level = ARG_LEVEL(v_level);
strategy = ARG_STRATEGY(v_strategy);
n = z->stream.avail_out;
err = deflateParams(&z->stream, level, strategy);
filled = n - z->stream.avail_out;
while (err == Z_BUF_ERROR) {
rb_warning("deflateParams() returned Z_BUF_ERROR");
zstream_expand_buffer(z);
rb_str_set_len(z->buf, RSTRING_LEN(z->buf) + filled);
n = z->stream.avail_out;
err = deflateParams(&z->stream, level, strategy);
filled = n - z->stream.avail_out;
}
if (err != Z_OK) {
raise_zlib_error(err, z->stream.msg);
}
rb_str_set_len(z->buf, RSTRING_LEN(z->buf) + filled);
return Qnil;
} Изменяет параметры потока deflate, позволяя переключаться между разными типами данных, для которых требуются разные способы сжатия. Перед изменением параметров все необработанные данные сбрасываются.
Описание level и strategy см. в разделе Zlib::Deflate.new.
static VALUE
rb_deflate_set_dictionary(VALUE obj, VALUE dic)
{
struct zstream *z = get_zstream(obj);
VALUE src = dic;
int err;
StringValue(src);
err = deflateSetDictionary(&z->stream,
(Bytef*)RSTRING_PTR(src), RSTRING_LENINT(src));
if (err != Z_OK) {
raise_zlib_error(err, z->stream.msg);
}
return dic;
} Задает предварительно установленный словарь и возвращает string. Этот метод доступен только после вызова метода Zlib::Deflate.new или Zlib::ZStream#reset. Подробности см. в zlib.h.
Может вызвать ошибки Z_STREAM_ERROR, если параметр недопустим (например, словарь NULL) или состояние потока несогласованно, либо Z_DATA_ERROR, если заданный словарь не соответствует ожидаемому (неверное значение adler32).
Ruby Core © 1993–2025 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.