class Zlib::Inflate
Zlib::Inflate 是用于解压缩数据的类。与 Zlib::Deflate 不同,此类的实例无法复制(克隆、dup)自身。
Public Class Methods
Source
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_ensure_end, (VALUE)&z);
return dst;
}
解压缩 string。如果解压缩需要预设字典,则会引发 Zlib::NeedDict 异常。
此方法几乎等同于以下代码
def inflate(string) zstream = Zlib::Inflate.new buf = zstream.inflate(string) zstream.finish zstream.close buf end
另请参见 Zlib.deflate
Source
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;
}
创建一个新的解压缩流。window_bits 设置历史缓冲区的大小,并且可以具有以下值:
- 0
-
使用压缩流的 zlib 头部中的窗口大小进行解压缩。
- (8..15)
-
覆盖压缩流中解压缩头部的窗口大小。窗口大小必须大于或等于压缩流的窗口大小。
- 大于 15
-
将 32 加到 window_bits 以启用 zlib 和 gzip 解码(自动头部检测),或加 16 以仅解码 gzip 格式(对于非 gzip 流将引发
Zlib::DataError)。 - (-8..-15)
-
启用原始 deflate 模式,该模式不会生成校验值,也不会在流的末尾查找任何校验值进行比较。
这适用于使用 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
Public Instance Methods
Source
static VALUE
rb_inflate_addstr(VALUE obj, VALUE src)
{
struct zstream *z = get_zstream(obj);
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;
}
与 IO 相同。
Source
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;
}
为解压缩流提供未来可能需要的字典。可以提供多个字典。解压缩流将根据流所需的字典自动选择正确的用户提供的字典。
Source
static VALUE
rb_inflate_inflate(int argc, VALUE* argv, VALUE obj)
{
struct zstream *z = get_zstream(obj);
struct rb_zlib_inflate_arguments arguments = {z, argc, argv};
return rb_mutex_synchronize(z->mutex, rb_inflate_inflate_body, (VALUE)&arguments);
}
将 deflate_string 输入到解压缩流中并返回流的输出。调用此方法时,流的输入和输出缓冲区都会被刷新。如果 string 为 nil,此方法将结束流,就像 Zlib::ZStream#finish 一样。
如果给出了块,则连续解压缩的 deflate_string 的块将被传递给块,并返回 nil。
如果给出了 :buffer 关键字参数且不为 nil
-
:buffer 关键字应为
String,并将用作输出缓冲区。使用此选项可以重用解压缩过程中所需的内存。 -
当不传递块时,返回值将与 :buffer 关键字参数相同。
-
当传递块时,传递给块的块将与 :buffer 关键字参数的值相同。
如果需要预设字典进行解压缩,则会引发 Zlib::NeedDict 异常。通过 Zlib::Inflate#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
另请参见 Zlib::Inflate.new
Source
static VALUE
rb_inflate_set_dictionary(VALUE obj, VALUE dic)
{
struct zstream *z = get_zstream(obj);
VALUE src = dic;
int err;
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;
}
设置预设字典并返回 string。此方法仅在引发 Zlib::NeedDict 异常后可用。有关详细信息,请参阅 zlib.h。
Source
static VALUE
rb_inflate_sync(VALUE obj, VALUE src)
{
struct zstream *z = get_zstream(obj);
StringValue(src);
return zstream_sync(z, (Bytef*)RSTRING_PTR(src), RSTRING_LEN(src));
}
将 string 输入到输入缓冲区的末尾,并跳过数据直到找到完整的刷新点。如果缓冲区中找到了刷新点,则此方法会刷新缓冲区并返回 false。否则,它将返回 true,并且完整刷新点之后的后续数据将保留在缓冲区中。
Source
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;
}
原文文档逐字引用
What is this?
:)