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_string
和nil
返回块。
如果需要预置字典进行解压缩,则会引发 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;
}