首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Zlib::Deflate

Parent:Zlib::ZStream

Zlib :: Deflate 是压缩数据的类。有关更多信息,请参阅 Zlib :: ZStream。

公共类方法

deflate(string, level) Show source

Zlib::Deflate.deflate(string, level)

压缩给定的string。级别的有效值为 Zlib :: NO_COMPRESSION,Zlib :: BEST_SPEED,Zlib :: BEST_COMPRESSION,Zlib :: DEFAULT_COMPRESSION 或从0到9的整数。

该方法几乎等同于以下代码:

代码语言:javascript
复制
def deflate(string, level)
  z = Zlib::Deflate.new(level)
  dst = z.deflate(string, Zlib::FINISH)
  z.close
  dst
end

另请参阅 Zlib.inflate

代码语言:javascript
复制
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_end, (VALUE)&z);

    OBJ_INFECT(dst, src);
    return dst;
}

Zlib::Deflate.new(level=DEFAULT_COMPRESSION, window_bits=MAX_WBITS, mem_level=DEF_MEM_LEVEL, strategy=DEFAULT_STRATEGY) Show source

为压缩创建一个新的 deflate 流。如果给定的参数为零,则使用该参数的默认值。

level套为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 图像数据而设计

请参阅常量以获取更多描述。

例子

基本

代码语言:javascript
复制
open "compressed.file", "w+" do |io|
  io << Zlib::Deflate.new.deflate(File.read("big.file"))
end

自定义压缩

代码语言:javascript
复制
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

虽然这个例子可以工作,但为了获得最佳优化,请查看特定时间的标志,内存使用情况和输出空间要求。

代码语言:javascript
复制
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;
}

公共实例方法

<< string Show source

输入string到 deflate 流中就像 #deflate 一样,但返回 Zlib :: Deflate 对象本身。流的输出保存在输出缓冲区中。

代码语言:javascript
复制
static VALUE
rb_deflate_addstr(VALUE obj, VALUE src)
{
    OBJ_INFECT(obj, src);
    do_deflate(get_zstream(obj), src, Z_NO_FLUSH);
    return obj;
}

deflate(string, flush = Zlib::NO_FLUSH) → String Show source

deflate(string, flush = Zlib::NO_FLUSH) { |chunk| ... } → nil

输入string到 deflate 流并返回流的输出。在调用此方法时,流的输入缓冲区和输出缓冲区都将被刷新。如果string为零,则此方法完成流,就像 Zlib :: ZStream# 完成一样。

如果一个块被赋予连续的放气块string并且nil返回到块。

flush参数指定了刷新模式。可以使用以下常量:

Zlib::NO_FLUSH

默认值

Zlib::SYNC_FLUSH

将输出刷新到字节边界

Zlib::FULL_FLUSH

SYNC_FLUSH +重置压缩状态

Zlib::FINISH

待处理的输入被处理,待处理的输出被刷新。

请参阅常量以获取更多描述。

代码语言:javascript
复制
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);
    OBJ_INFECT(obj, src);
    do_deflate(z, src, ARG_FLUSH(flush));

    return zstream_detach_buffer(z);
}

flush(flush = Zlib::SYNC_FLUSH) → String Show source

flush(flush = Zlib::SYNC_FLUSH) { |chunk| ... } → nil

这种方法相当于deflate('', flush)。这个方法只是为了提高 Ruby 程序的可读性而提供的。如果给出一个块,放气输出将被放到块中,直到缓冲区被清空。

有关flush常量 NO_FLUSH,SYNC_FLUSH,FULL_FLUSH 和 FINISH的 详细信息,请参阅 #deflate 。

代码语言:javascript
复制
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);
}

initialize_copy(p1) Show source

复制 deflate 流。

代码语言:javascript
复制
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->buf_filled = z2->buf_filled;
    z1->flags = z2->flags;

    return self;
}

params(level, strategy) Show source

更改 deflate 流的参数以允许需要不同类型的压缩的不同类型的数据之间进行更改。任何未处理的数据在更改参数前都会刷新。

请参阅:新的描述levelstrategy

代码语言:javascript
复制
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;

    level = ARG_LEVEL(v_level);
    strategy = ARG_STRATEGY(v_strategy);

    n = z->stream.avail_out;
    err = deflateParams(&z->stream, level, strategy);
    z->buf_filled += n - z->stream.avail_out;
    while (err == Z_BUF_ERROR) {
        rb_warning("deflateParams() returned Z_BUF_ERROR");
        zstream_expand_buffer(z);
        n = z->stream.avail_out;
        err = deflateParams(&z->stream, level, strategy);
        z->buf_filled += n - z->stream.avail_out;
    }
    if (err != Z_OK) {
        raise_zlib_error(err, z->stream.msg);
    }

    return Qnil;
}

set_dictionary(string) Show source

设置预设字典并返回string。该方法仅在调用 :: new 或 Zlib :: ZStream#reset 方法后才可用。有关详细信息,请参见 zlib.h。

如果参数无效(例如 NULL 字典)或流状态不一致,则可能引发 Z_STREAM_ERROR 错误;如果给定字典与预期字典不匹配,则 Z_DATA_ERROR 错误(不正确的 adler32值)

代码语言:javascript
复制
static VALUE
rb_deflate_set_dictionary(VALUE obj, VALUE dic)
{
    struct zstream *z = get_zstream(obj);
    VALUE src = dic;
    int err;

    OBJ_INFECT(obj, dic);
    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;
}

扫码关注腾讯云开发者

领取腾讯云代金券