Ruby 2.4

Zlib::Inflate

class Zlib::Inflate

Parent:Zlib::ZStream

Zlib:Inflate 是解压缩压缩数据的类。与 Zlib :: Deflate 不同,此类的一个实例本身不能复制(clone,dup)。

公共类方法

inflate(string) Show source

Zlib::Inflate.inflate(string)

解压缩string。如果解压缩需要预设字典,则引发 Zlib :: NeedDict 异常。

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

def inflate(string) zstream = Zlib::Inflate.new buf = zstream.inflate(string) zstream.finish zstream.close buf end

另请参阅 Zlib.deflate

static VALUE rb_inflate_s_inflate(VALUE obj, VALUE src) { struct zstream z; VALUE dst, args[2]; int err; StringValue(src zstream_init_inflate(&z err = inflateInit(&z.stream if (err != Z_OK) { raise_zlib_error(err, z.stream.msg } ZSTREAM_READY(&z args[0] = (VALUE)&z; args[1] = src; dst = rb_ensure(inflate_run, (VALUE)args, zstream_end, (VALUE)&z OBJ_INFECT(dst, src return dst; }

Zlib::Inflate.new(window_bits = Zlib::MAX_WBITS) Show source

为解压创建一个新的充气流。window_bits设置历史记录缓冲区的大小,并可以具有以下值:

0

使用压缩流的 zlib 头中的窗口大小膨胀。

(8..15)

覆盖压缩流中充气标题的窗口大小。窗口大小必须大于或等于压缩流的窗口大小。

大于15

将32添加到 window_bits 以启用自动头检测的 zlib 和 gzip 解码,或者添加16来仅解码 gzip 格式(针对非 gzip 流引发 Zlib :: DataError)。

(-8..-15)

启用不会生成检查值的原始缩放模式,并且不会在流末尾查找任何用于比较的检查值。

这适用于其他使用 deflate 压缩数据格式的格式,例如 zip,它们提供自己的检查值。

open "compressed.file" do |compressed_io| zi = Zlib::Inflate.new(Zlib::MAX_WBITS + 32) begin open "uncompressed.file", "w+" do |uncompressed_io| uncompressed_io << zi.inflate(compressed_io.read) end ensure zi.close end end

static VALUE rb_inflate_initialize(int argc, VALUE *argv, VALUE obj) { struct zstream *z; VALUE wbits; int err; rb_scan_args(argc, argv, "01", &wbits TypedData_Get_Struct(obj, struct zstream, &zstream_data_type, z err = inflateInit2(&z->stream, ARG_WBITS(wbits) if (err != Z_OK) { raise_zlib_error(err, z->stream.msg } ZSTREAM_READY(z return obj; }

公共实例方法

<<(p1) Show source

与 IO 相同。

static VALUE rb_inflate_addstr(VALUE obj, VALUE src) { struct zstream *z = get_zstream(obj OBJ_INFECT(obj, src if (ZSTREAM_IS_FINISHED(z)) { if (!NIL_P(src)) { StringValue(src zstream_append_buffer2(z, src } } else { do_inflate(z, src if (ZSTREAM_IS_FINISHED(z)) { zstream_passthrough_input(z } } return obj; }

add_dictionary(string) Show source

为充气流提供将来可能需要的字典。可能会提供多个字典。inflate 流将根据流所需的字典自动选择正确的用户提供的字典。

static VALUE rb_inflate_add_dictionary(VALUE obj, VALUE dictionary) { VALUE dictionaries = rb_ivar_get(obj, id_dictionaries VALUE checksum = do_checksum(1, &dictionary, adler32 rb_hash_aset(dictionaries, checksum, dictionary return obj; }

inflate(deflate_string) → String Show source

inflate(deflate_string) { |chunk| ... } → nil

输入deflate_string到膨胀流中并返回流中的输出。调用此方法时,流的输入缓冲区和输出缓冲区都将被刷新。如果字符串是nil,则此方法完成流,就像 Zlib :: ZStream# 完成一样。

如果一个块被赋予连续的膨胀块,deflate_stringnil返回块。

如果需要预置字典进行解压缩,则会引发 Zlib :: NeedDict 异常。使用 #set_dictionary 设置字典,然后再次使用空字符串调用此方法以刷新流:

inflater = Zlib::Inflate.new begin out = inflater.inflate compressed rescue Zlib::NeedDict # ensure the dictionary matches the stream's required dictionary raise unless inflater.adler == Zlib.adler32(dictionary) inflater.set_dictionary dictionary inflater.inflate '' end # ... inflater.close

另见 :: new

static VALUE rb_inflate_inflate(VALUE obj, VALUE src) { struct zstream *z = get_zstream(obj VALUE dst; OBJ_INFECT(obj, src if (ZSTREAM_IS_FINISHED(z)) { if (NIL_P(src)) { dst = zstream_detach_buffer(z } else { StringValue(src zstream_append_buffer2(z, src dst = rb_str_new(0, 0 OBJ_INFECT(dst, obj } } else { do_inflate(z, src dst = zstream_detach_buffer(z if (ZSTREAM_IS_FINISHED(z)) { zstream_passthrough_input(z } } return dst; }

set_dictionary(p1) Show source

设置预设字典并返回string。只有在引发 Zlib :: NeedDict 异常之后才能使用此方法。有关详细信息,请参见 zlib.h。

static VALUE rb_inflate_set_dictionary(VALUE obj, VALUE dic) { struct zstream *z = get_zstream(obj VALUE src = dic; int err; OBJ_INFECT(obj, dic StringValue(src err = inflateSetDictionary(&z->stream, (Bytef*)RSTRING_PTR(src), RSTRING_LENINT(src) if (err != Z_OK) { raise_zlib_error(err, z->stream.msg } return dic; }

sync(string) Show source

输入string到输入缓冲区的末尾并跳过数据,直到找到完整的冲洗点。如果在缓冲区中找到该点,则此方法刷新缓冲区并返回 false。否则,它将返回true并且全部冲洗点的以下数据将保留在缓冲区中。

static VALUE rb_inflate_sync(VALUE obj, VALUE src) { struct zstream *z = get_zstream(obj OBJ_INFECT(obj, src StringValue(src return zstream_sync(z, (Bytef*)RSTRING_PTR(src), RSTRING_LEN(src) }

sync_point?() Show source

从原始文件中逐字引用:

What is this?

:)

static VALUE rb_inflate_sync_point_p(VALUE obj) { struct zstream *z = get_zstream(obj int err; err = inflateSyncPoint(&z->stream if (err == 1) { return Qtrue; } if (err != Z_OK) { raise_zlib_error(err, z->stream.msg } return Qfalse; }