Zlib::Deflate
class 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 流的参数以允许需要不同类型的压缩的不同类型的数据之间进行更改。任何未处理的数据在更改参数前都会刷新。
请参阅:新的描述level
和strategy
。
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;
}