Zlib
module Zlib
该模块提供对 zlib 库的访问。Zlib 旨在成为一种便携式,免费,通用,法律上不受阻碍 - 即不受任何专利保护的无损数据压缩库,可用于几乎任何计算机硬件和操作系统。
zlib 压缩库提供了内存中的压缩和解压缩功能,包括未压缩数据的完整性检查。
RFC 1950 中描述了 zlib 压缩数据格式,它是 RFC 1951中描述的 deflate 流的封装。
该库还支持以类似于 IO 的界面读写gzip(.gz)格式的文件。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...
类树
- Zlib::Deflate
- [Zlib::StreamEnd](zlib/streamend)
- [Zlib::NeedDict](zlib/needdict)
- [Zlib::DataError](zlib/dataerror)
- [Zlib::StreamError](zlib/streamerror)
- [Zlib::MemError](zlib/memerror)
- [Zlib::BufError](zlib/buferror)
- [Zlib::VersionError](zlib/versionerror)
(如果你有 GZIP_SUPPORT)
- Zlib::GzipReader
- [Zlib::GzipFile::LengthError](zlib/gzipfile/lengtherror)
- [Zlib::GzipFile::CRCError](zlib/gzipfile/crcerror)
- [Zlib::GzipFile::NoFooter](zlib/gzipfile/nofooter)
常量
ASCII
通过 deflate 表示文本数据。
注意:zlib 1.2.2中的基础常量 Z_ASCII 不赞成 Z_TEXT。新的应用程序不应该使用这个常量。
See Zlib::ZStream#data_type.
BEST_COMPRESSION
最慢的压缩级别,但节省空间最佳。
BEST_SPEED
最快的压缩级别,但节省空间最少。
BINARY
按照放气猜测来表示二进制数据。
See Zlib::ZStream#data_type.
DEFAULT_COMPRESSION
默认压缩级别,这是空间和时间之间的良好折衷
DEFAULT_STRATEGY
用于普通数据的默认 deflate 策略。
DEF_MEM_LEVEL
分配 zlib 的默认内存级别放气压缩状态。
FILTERED
为过滤器(或预测器)生成的数据放气策略。FILTEREDt的作用是强制更多的霍夫曼代码和更少的字符串匹配; 它在tDEFAULT_STRATEGYt和HUFFMAN_ONLYt之间有点中间。经过滤的数据主要由小的值组成,并且分布有些随机。
FINISH
处理所有待处理的输入并刷新待处理的输出。
FIXED
防止动态霍夫曼编码使用的放气策略,允许更简单的专用应用解码器。
FULL_FLUSH
像 SYNC_FLUSH 一样刷新所有输出,并且压缩状态被重置,以便如果先前的压缩数据已经被损坏或者如果需要随机访问,解压缩可以从这一点重新开始。像 SYNC_FLUSH 一样,使用 FULL_FLUSH 常常会严重降低压缩率。
HUFFMAN_ONLY
仅使用霍夫曼码的放气策略(无字符串匹配)。
MAX_MEM_LEVEL
分配 zlib 的最大内存级别放气压缩状态。
MAX_WBITS
zlib 历史缓冲区的最大大小。请注意,zlib 允许较大的值启用不同的充气模式。有关详细信息,请参阅 Zlib :: Inflate.new。
NO_COMPRESSION
没有压缩,通过数据不变。使用它将预压缩数据附加到 deflate 流。
NO_FLUSH
NO_FLUSH 是默认的刷新方法,允许 deflate 在产生输出之前决定要累积多少数据以最大化压缩。
OS_AMIGA
OS code for Amiga hosts
OS_ATARI
OS code for Atari hosts
OS_CODE
The OS code of current host
OS_CPM
OS code for CP/M hosts
OS_MACOS
OS code for Mac OS hosts
OS_MSDOS
OS code for MSDOS hosts
OS_OS2
OS code for OS2 hosts
OS_QDOS
OS code for QDOS hosts
OS_RISCOS
OS code for RISC OS hosts
OS_TOPS20
OS code for TOPS-20 hosts
OS_UNIX
OS code for UNIX hosts
OS_UNKNOWN
未知主机的操作系统代码
OS_VMCMS
VM OS 主机的 OS 代码
OS_VMS
VMS 主机的操作系统代码
OS_WIN32
Win32主机的操作系统代码
OS_ZSYSTEM
Z 系统主机的 OS 代码
RLE
Deflate 设计的压缩策略几乎与 HUFFMAN_ONLY 一样快,但可以更好地压缩 PNG 图像数据。
SYNC_FLUSH
SYNC_FLUSH 方法将所有挂起的输出刷新到输出缓冲区,并且输出在字节边界上对齐。刷新可能会降低压缩率,因此应仅在必要时使用压缩,例如在网络流的请求或响应边界处。
TEXT
通过 deflate 表示文本数据。
See Zlib::ZStream#data_type.
UNKNOWN
通过 deflate表示未知的数据类型。
See Zlib::ZStream#data_type.
VERSION
The Ruby/zlib version string.
ZLIB_VERSION
表示 zlib.h 版本的字符串
公共类方法
adler32(string, adler) Show source
计算 Adler-32校验和string
,并返回更新值adler
。如果string
省略,则返回 Adler-32的初始值。如果adler
省略,则假定给出初始值adler
。
用法示例:
require "zlib"
data = "foo"
puts "Adler32 checksum: #{Zlib.adler32(data).to_s(16)}"
#=> Adler32 checksum: 2820145
static VALUE
rb_zlib_adler32(int argc, VALUE *argv, VALUE klass)
{
return do_checksum(argc, argv, adler32
}
adler32_combine(adler1, adler2, len2) Show source
将两个 Adler-32检查值合并为一个。alder1
是第一个 Adler-32值,adler2
是第二个 Adler-32值。len2
是用于生成的字符串的长度adler2
。
static VALUE
rb_zlib_adler32_combine(VALUE klass, VALUE adler1, VALUE adler2, VALUE len2)
{
return ULONG2NUM(
adler32_combine(NUM2ULONG(adler1), NUM2ULONG(adler2), NUM2LONG(len2))
}
crc32(string, crc) Show source
计算 CRC 校验和string
,并返回更新值crc
。如果string
省略,则返回 CRC 初始值。如果crc
省略,则假定给出初始值crc
。
FIXME: expression.
static VALUE
rb_zlib_crc32(int argc, VALUE *argv, VALUE klass)
{
return do_checksum(argc, argv, crc32
}
crc32_combine(crc1, crc2, len2) Show source
将两个 CRC-32校验值合并为一个。crc1
是第一个 CRC-32值,crc2
是第二个 CRC-32值。len2
是用于生成的字符串的长度crc2
。
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_table() Show source
返回用于计算 CRC 校验和的表作为数组。
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;
}
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
See also ::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;
}
gunzip(src) → String Show source
解码给定的 gzip string
。
该方法几乎等同于以下代码:
def gunzip(string)
sio = StringIO.new(string)
gz = Zlib::GzipReader.new(sio, encoding: Encoding::ASCII_8BIT)
gz.read
ensure
gz&.close
end
See also ::gzip
static VALUE
zlib_gunzip(VALUE klass, VALUE src)
{
struct gzfile gz0;
struct gzfile *gz = &gz0;
int err;
VALUE dst;
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
gzfile_read_header(gz
dst = zstream_detach_buffer(&gz->z
gzfile_calc_crc(gz, dst
if (!ZSTREAM_IS_FINISHED(&gz->z)) {
rb_raise(cGzError, "unexpected end of file"
}
if (NIL_P(gz->z.input))
rb_raise(cNoFooter, "footer is not found"
gzfile_check_footer(gz
return dst;
}
gzip(src, level: nil, strategy: nil) → String Show source
Gzip 给定string
。级别的有效值为 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
See also ::gunzip
static VALUE
zlib_s_gzip(int argc, VALUE *argv, VALUE klass)
{
struct gzfile gz0;
struct gzfile *gz = &gz0;
long len;
int err;
VALUE src, opts, level=Qnil, strategy=Qnil;
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) {
raise_zlib_error(err, gz->z.stream.msg
}
ZSTREAM_READY(&gz->z
gzfile_make_header(gz
len = RSTRING_LEN(src
if (len > 0) {
Bytef *ptr = (Bytef *)RSTRING_PTR(src
gz->crc = checksum_long(crc32, gz->crc, ptr, len
zstream_run(&gz->z, ptr, len, Z_NO_FLUSH
}
gzfile_close(gz, 0
return zstream_detach_buffer(&gz->z
}
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
See also ::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_version() Show source
返回表示 zlib 库版本的字符串。
static VALUE
rb_zlib_version(VALUE klass)
{
VALUE str;
str = rb_str_new2(zlibVersion()
OBJ_TAINT(str /* for safe */
return str;
}