模块 Zlib
此模块提供对 zlib 库的访问。Zlib 被设计成一个可移植、免费、通用的、在法律上不受限制的(即,不受任何专利保护)无损数据压缩库,可在几乎任何计算机硬件和操作系统上使用。
zlib 压缩库提供内存中的压缩和解压缩功能,包括对未压缩数据的完整性检查。
zlib 压缩数据格式在 RFC 1950 中描述,它是一个围绕 RFC 1951 中描述的 deflate 流的包装器。
该库还支持以 gzip (.gz) 格式读取和写入文件,其接口类似于 IO。 gzip 格式在 RFC 1952 中描述,它也是围绕 deflate 流的包装器。
zlib 格式被设计为紧凑且快速,以便在内存和通信通道中使用。 gzip 格式是为文件系统上的单个文件压缩而设计的,具有比 zlib 更大的头部以维护目录信息,并使用与 zlib 不同的、较慢的检查方法。
有关 zlib 的更多信息,请参阅系统的 zlib.h
使用示例¶ ↑
使用包装器以默认参数压缩字符串非常简单
require "zlib" data_to_compress = File.read("don_quixote.txt") puts "Input size: #{data_to_compress.size}" #=> Input size: 2347740 data_compressed = Zlib::Deflate.deflate(data_to_compress) puts "Compressed size: #{data_compressed.size}" #=> Compressed size: 887238 uncompressed_data = Zlib::Inflate.inflate(data_compressed) puts "Uncompressed data is: #{uncompressed_data}" #=> Uncompressed data is: The Project Gutenberg EBook of Don Quixote...
类 树¶ ↑
(如果您有 GZIP_SUPPORT)
常量
- ASCII
-
表示由 deflate 猜测的文本数据。
注意:底层常量 Z_ASCII 在 zlib 1.2.2 中已被弃用,转而使用 Z_TEXT。 新的应用程序不应使用此常量。
- BEST_COMPRESSION
-
最慢的压缩级别,但节省的空间最大。
- BEST_SPEED
-
最快的压缩级别,但节省的空间最小。
- BINARY
-
表示由 deflate 猜测的二进制数据。
- DEFAULT_COMPRESSION
-
默认的压缩级别,在空间和时间之间取得了良好的平衡
- DEFAULT_STRATEGY
-
用于正常数据的默认 deflate 策略。
- DEF_MEM_LEVEL
-
用于分配 zlib deflate 压缩状态的默认内存级别。
- FILTERED
-
用于过滤器(或预测器)生成的数据的
Deflate策略。FILTERED的作用是强制使用更多的 Huffman 代码,减少字符串匹配;它在DEFAULT_STRATEGY和HUFFMAN_ONLY之间。过滤后的数据主要由具有某种随机分布的小值组成。 - FINISH
-
处理所有待处理的输入并刷新待处理的输出。
- FIXED
-
Deflate策略,可防止使用动态 Huffman 代码,从而允许为专用应用程序使用更简单的解码器。 - FULL_FLUSH
-
刷新所有输出,类似于
SYNC_FLUSH,并且压缩状态会重置,以便在先前的压缩数据损坏或需要随机访问时,可以从此处重新开始解压缩。与SYNC_FLUSH一样,过于频繁地使用FULL_FLUSH会严重降低压缩率。 - HUFFMAN_ONLY
-
Deflate策略,仅使用 Huffman 代码(无字符串匹配)。 - MAX_MEM_LEVEL
-
用于分配 zlib deflate 压缩状态的最大内存级别。
- MAX_WBITS
-
zlib 历史缓冲区最大大小。请注意,zlib 允许更大的值来启用不同的 inflate 模式。有关详细信息,请参阅
Zlib::Inflate.new。 - NO_COMPRESSION
-
不压缩,直接传递数据。使用此选项将预压缩数据附加到 deflate 流。
- NO_FLUSH
-
NO_FLUSH是默认的刷新方法,它允许 deflate 决定在生成输出之前累积多少数据,以便最大化压缩率。 - OS_AMIGA
-
Amiga 主机的操作系统代码
- OS_ATARI
-
Atari 主机的操作系统代码
- OS_CODE
-
当前主机的操作系统代码
- OS_CPM
-
CP/M 主机的操作系统代码
- OS_MACOS
-
Mac OS 主机的操作系统代码
- OS_MSDOS
-
MSDOS 主机的操作系统代码
- OS_OS2
-
OS2 主机的操作系统代码
- OS_QDOS
-
QDOS 主机的操作系统代码
- OS_RISCOS
-
RISC OS 主机的操作系统代码
- OS_TOPS20
-
TOPS-20 主机的操作系统代码
- OS_UNIX
-
UNIX 主机的操作系统代码
- OS_UNKNOWN
-
未知主机的操作系统代码
- OS_VMCMS
-
VM OS 主机的操作系统代码
- OS_VMS
-
VMS 主机的操作系统代码
- OS_WIN32
-
Win32主机的操作系统代码 - OS_ZSYSTEM
-
Z-System 主机的操作系统代码
- RLE
-
Deflate压缩策略,设计为几乎与HUFFMAN_ONLY一样快,但对于 PNG 图像数据提供更好的压缩率。 - SYNC_FLUSH
-
SYNC_FLUSH方法将所有待处理的输出刷新到输出缓冲区,并且输出与字节边界对齐。 刷新可能会降低压缩率,因此仅应在必要时使用,例如在网络流的请求或响应边界处。 - TEXT
-
表示由 deflate 猜测的文本数据。
- UNKNOWN
-
表示由 deflate 猜测的未知数据类型。
- VERSION
-
Ruby/zlib 版本字符串。
- ZLIB_VERSION
-
表示 zlib.h 版本的字符串
公共类方法
来源
static VALUE
rb_zlib_adler32(int argc, VALUE *argv, VALUE klass)
{
return do_checksum(argc, argv, adler32);
}
计算 string 的 Adler-32 校验和,并返回 adler 的更新值。如果省略 string,则返回 Adler-32 的初始值。如果省略 adler,则假定 adler 具有初始值。如果 string 是 IO 实例,则从 IO 读取,直到 IO 返回 nil,并返回所有读取数据的 Adler-32 值。
使用示例
require "zlib" data = "foo" puts "Adler32 checksum: #{Zlib.adler32(data).to_s(16)}" #=> Adler32 checksum: 2820145
来源
static VALUE
rb_zlib_adler32_combine(VALUE klass, VALUE adler1, VALUE adler2, VALUE len2)
{
return ULONG2NUM(
adler32_combine(NUM2ULONG(adler1), NUM2ULONG(adler2), NUM2LONG(len2)));
}
将两个 Adler-32 校验值组合成一个。adler1 是第一个 Adler-32 值,adler2 是第二个 Adler-32 值。len2 是用于生成 adler2 的字符串的长度。
来源
来源
static VALUE
rb_zlib_crc32_combine(VALUE klass, VALUE crc1, VALUE crc2, VALUE len2)
{
return ULONG2NUM(
crc32_combine(NUM2ULONG(crc1), NUM2ULONG(crc2), NUM2LONG(len2)));
}
将两个 CRC-32 校验值组合成一个。crc1 是第一个 CRC-32 值,crc2 是第二个 CRC-32 值。len2 是用于生成 crc2 的字符串的长度。
来源
static VALUE
rb_zlib_crc_table(VALUE obj)
{
#if !defined(HAVE_TYPE_Z_CRC_T)
/* z_crc_t is defined since zlib-1.2.7. */
typedef unsigned long z_crc_t;
#endif
const z_crc_t *crctbl;
VALUE dst;
int i;
crctbl = get_crc_table();
dst = rb_ary_new2(256);
for (i = 0; i < 256; i++) {
rb_ary_push(dst, rb_uint2inum(crctbl[i]));
}
return dst;
}
以数组形式返回用于计算 CRC 校验和的表。
来源
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;
}
压缩给定的 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
zlib_gunzip(VALUE klass, VALUE src)
{
struct gzfile gz0;
struct gzfile *gz = &gz0;
int err;
StringValue(src);
gzfile_init(gz, &inflate_funcs, zlib_gunzip_end);
err = inflateInit2(&gz->z.stream, -MAX_WBITS);
if (err != Z_OK) {
raise_zlib_error(err, gz->z.stream.msg);
}
gz->io = Qundef;
gz->z.input = src;
ZSTREAM_READY(&gz->z);
return rb_ensure(zlib_gunzip_run, (VALUE)gz, zlib_gzip_ensure, (VALUE)gz);
}
解码给定的 gzip 压缩的 string。
此方法几乎等效于以下代码
def gunzip(string) sio = StringIO.new(string) gz = Zlib::GzipReader.new(sio, encoding: Encoding::ASCII_8BIT) gz.read ensure gz&.close end
另请参阅 Zlib.gzip
来源
static VALUE
zlib_s_gzip(int argc, VALUE *argv, VALUE klass)
{
struct gzfile gz0;
struct gzfile *gz = &gz0;
int err;
VALUE src, opts, level=Qnil, strategy=Qnil, args[2];
if (OPTHASH_GIVEN_P(opts)) {
ID keyword_ids[2];
VALUE kwargs[2];
keyword_ids[0] = id_level;
keyword_ids[1] = id_strategy;
rb_get_kwargs(opts, keyword_ids, 0, 2, kwargs);
if (kwargs[0] != Qundef) {
level = kwargs[0];
}
if (kwargs[1] != Qundef) {
strategy = kwargs[1];
}
}
rb_scan_args(argc, argv, "10", &src);
StringValue(src);
gzfile_init(gz, &deflate_funcs, zlib_gzip_end);
gz->level = ARG_LEVEL(level);
err = deflateInit2(&gz->z.stream, gz->level, Z_DEFLATED,
-MAX_WBITS, DEF_MEM_LEVEL, ARG_STRATEGY(strategy));
if (err != Z_OK) {
zlib_gzip_end(gz);
raise_zlib_error(err, gz->z.stream.msg);
}
ZSTREAM_READY(&gz->z);
args[0] = (VALUE)gz;
args[1] = src;
return rb_ensure(zlib_gzip_run, (VALUE)args, zlib_gzip_ensure, (VALUE)gz);
}
gzip 压缩给定的 string。level 的有效值是 Zlib::NO_COMPRESSION、Zlib::BEST_SPEED、Zlib::BEST_COMPRESSION、Zlib::DEFAULT_COMPRESSION(默认)或一个从 0 到 9 的整数。
此方法几乎等效于以下代码
def gzip(string, level: nil, strategy: nil) sio = StringIO.new sio.binmode gz = Zlib::GzipWriter.new(sio, level, strategy) gz.write(string) gz.close sio.string end
另请参阅 Zlib.gunzip
来源
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
来源
static VALUE
rb_zlib_version(VALUE klass)
{
return rb_str_new2(zlibVersion());
}
返回表示 zlib 库版本的字符串。