類別 Zlib::Deflate

Zlib::Deflate 是用於壓縮資料的類別。有關詳細資訊,請參閱 Zlib::ZStream

公開類別方法

deflate(string[, level]) 按一下以切換來源
Zlib::Deflate.deflate(string[, level])

壓縮指定的 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_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;
}
Zlib::Deflate.new(level=DEFAULT_COMPRESSION, window_bits=MAX_WBITS, mem_level=DEF_MEM_LEVEL, strategy=DEFAULT_STRATEGY) 按一下以切換來源

建立新的 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

防止動態 Huffman 碼

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 按一下以切換來源

string 輸入 deflate 串流,就像 Zlib::Deflate#deflate 一樣,但會傳回 Zlib::Deflate 物件本身。串流的輸出會保留在輸出緩衝區中。

static VALUE
rb_deflate_addstr(VALUE obj, VALUE src)
{
    do_deflate(get_zstream(obj), src, Z_NO_FLUSH);
    return obj;
}
deflate(string, flush = Zlib::NO_FLUSH) → String 按一下以切換來源
deflate(string, flush = Zlib::NO_FLUSH) { |chunk| ... } → nil

string 輸入 deflate 串流,並傳回串流的輸出。呼叫此方法時,串流的輸入和輸出緩衝區都會清除。如果 string 為 nil,此方法會完成串流,就像 Zlib::ZStream#finish 一樣。

如果提供區塊,則會將 string 中連續的 deflate 區塊傳送給區塊,並傳回 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);
    do_deflate(z, src, ARG_FLUSH(flush));

    return zstream_detach_buffer(z);
}
flush(flush = Zlib::SYNC_FLUSH) → String 按一下以切換來源
flush(flush = Zlib::SYNC_FLUSH) { |chunk| ... } → nil

此方法等於 deflate('', flush)。提供此方法只是為了提高 Ruby 程式的可讀性。如果提供區塊,則會將 deflate 輸出的區塊傳送給區塊,直到緩衝區清除為止。

請參閱 Zlib::Deflate#deflate 以取得有關 flush 常數 NO_FLUSH、SYNC_FLUSH、FULL_FLUSH 和 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);
}
initialize_copy(p1) 按一下以切換來源

複製 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;
}
params(level, strategy) 按一下以切換來源

變更 deflate 串流的參數,以允許在需要不同類型壓縮的不同資料類型之間進行變更。在變更 params 之前,會先清除任何未處理的資料。

請參閱 Zlib::Deflate.new 以取得 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;
    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;
}
set_dictionary(string) 按一下以切換來源

設定預設字典,並傳回 string。此方法僅在呼叫 Zlib::Deflate.newZlib::ZStream#reset 方法後才可用。請參閱 zlib.h 以取得詳細資料。

如果參數無效(例如 NULL 字典)或串流狀態不一致,可能會引發 Z_STREAM_ERROR 錯誤;如果指定的字典與預期的字典不符(不正確的 adler32 值),則可能會引發 Z_DATA_ERROR 錯誤

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