非常教程

Ruby 2.4参考手册

Zlib

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的整数。

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

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_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 图像数据而设计

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

例子

基本

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_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 对象本身。流的输出保存在输出缓冲区中。

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

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

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

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 。

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 流。

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

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值)

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;
}
Ruby 2.4

Ruby 是一种面向对象、命令式、函数式、动态的通用编程语言,是世界上最优美而巧妙的语言。

主页 https://www.ruby-lang.org/
源码 https://github.com/ruby/ruby
版本 2.4
发布版本 2.4.1

Ruby 2.4目录

1.缩略 | Abbrev
2.ARGF
3.数组 | Array
4.Base64
5.基本对象 | BasicObject
6.基准测试 | Benchmark
7.BigDecimal
8.绑定 | Binding
9.CGI
10.类 | Class
11.比较 | Comparable
12.负责 | Complex
13.计算续体 | Continuation
14.覆盖 | Coverage
15.CSV
16.日期 | Date
17.日期时间 | DateTime
18.DBM
19.代理 | Delegator
20.摘要 | Digest
21.Dir
22.DRb
23.编码 | Encoding
24.枚举 | Enumerable
25.枚举 | Enumerator
26.ENV
27.ERB
28.错误 | Errors
29.Etc
30.期望值 | Exception
31.错误类 | FalseClass
32.Fiber
33.Fiddle
34.文件 | File
35.文件实用程序 | FileUtils
36.查找 | Find
37.浮点 | Float
38.Forwardable
39.GC
40.GDBM
41.GetoptLong
42.Hash
43.Integer
44.IO
45.IPAddr
46.JSON
47.Kernel
48.语言 | 3Language
49.记录 | Logger
50.编排 | Marshal
51.MatchData
52.数学 | Math
53.矩阵 | Matrix
54.方法 | Method
55.模型 | Module
56.监控 | Monitor
57. 互斥 | Mutex
58.Net
59.Net::FTP
60.Net::HTTP
61.Net::IMAP
62.Net::SMTP
63.NilClass
64.数字 | Numeric
65.对象 | Object
66.ObjectSpace
67.Observable
68.Open3
69.OpenSSL
70.OpenStruct
71.OpenURI
72.OptionParser
73.路径名 | Pathname
74.完整输出 | PrettyPrint
75.Prime
76.Proc
77.过程 | Process
78.PStore
79.PTY
80.队列 | Queue
81.随机 | Random
82.范围 | Range
83.合理的 | Rational
84.Readline
85.Regexp
86.Resolv
87.Ripper
88.RubyVM
89.Scanf
90.SDBM
91.SecureRandom
92.Set
93.Shell
94.信号 | Signal
95.Singleton
96.套接字 | Socket
97.字符串 | String
98.StringIO
99.StringScanner
100.结构 | Struct